• 1402/03/16

نمایش مناسب صفحه عدم دسترسی به کاربر :

سلام و وقت بخیر خدمت همه دوستان و استاد عزیزم

در پروژه شما خیلی عالی مباحث مربوط به ajax رو بیان شده، تشکر بابت زحمات شما

تو سوالات قبلی به این اشاره شده بود که اگه بخوایم در پیاده سازی می تونیم به این شکل مدل های خودمون رو داشته باشیم، که منم به همین شکل پیاده سازی کردم.

که با این مدل معنایی داده ما نهایتا 5 جدول داریم، شامل:

User, Role, UserRole, Permission, RolePermission

تمامی نکات مربوط به پیاده سازی رو انجام دادم و خدا رو شکر مشکلی نیست. در پنل مدیریت به این شکل پیاده سازی ها رو انجام دادم که در منو ها مثلا روی لینک کاربران کلیک می کنید شما رو به صفحه Users ارجاع می دهم، در صورتیکه دسترسی نداشتید، شما را به صفحه عدم دسترسی هدایت می کنم.

حالا با توجه به مدل بالا، من برای تمامی اکشن ها دسترسی ایجاد کردم، مثلا در خصوص کاربران(نمایش لیست، ویرایش، حذف و ...) - که اشاره کنم بعد نمایش کاربران تمامی اکشن های دیگر به صورت Modal نمایش داده می شوند و در صورتیکه دسترسی نداشته باشند در Modal مربوطه، پارشیال عدم دسترسی رو نمایش می دهم. ولی برای خود صفحه کاربران که اگر دسترسی نداشته باشد. نمی تونم از پارشیال عدم دسترسی استفاده کنم، ویو نمایش رو بهم می زند(چونکه دارم پارشال بر می گردونم). لطفا راهنمایی می کنید که چطور وقتی شما در سایدبار ادمین روی لینک کاربران کلیک می کنید قبل از ارجاع به صفحه مدیریت کاربران، یک  مودال عدم دسترسی به شما نمایش دهم؟

ببخشید طولانی بود، گفتم دیگر دوستان هم از موضوع استفاده کنم.

بابت دوره خوبتون، بینهایت از شما سپاس گزارم - زنده باشید

 

  • 1402/03/17
  • ساعت 09:34

سلام وقت بخیر دوستان،

نمونه کد جهت دریافت Url درخواستی کاربر با توجه به تحلیل بالا، کد خودم رو تغییر دادم، به قسمت کامنت شده هم دقت شود.

public class PermissionCheckerAttribute : AuthorizeAttribute, IAsyncAuthorizationFilter
    {
        private IRolePermissionService _rolePermissionService;
        public PermissionCheckerAttribute() { }

        public async Task OnAuthorizationAsync(AuthorizationFilterContext context)
        {
            _rolePermissionService = (IRolePermissionService)context.HttpContext.RequestServices.GetService(typeof(IRolePermissionService))!;

            if (context.HttpContext.User.Identity!.IsAuthenticated)
            {
                var userId = context.HttpContext.User.GetUserId();

                var area = context.ActionDescriptor.RouteValues["area"]!.ToString();
                var controller = context.ActionDescriptor.RouteValues["controller"]!.ToString();
                var action = context.ActionDescriptor.RouteValues["action"]!.ToString();

                if (!await _rolePermissionService.HasPermission(userId, area, controller, action))
                {
                    string returnUrl = context.HttpContext.Request.Path;
                    //context.Result = new RedirectResult("/" + area + "/Home/AccessDenied?returnUrl=" + returnUrl);
                    context.Result = new ForbidResult();
                }
            }
            else
            {
                context.Result = new RedirectResult("/Login?returnUrl=" + context.HttpContext.Request.Path);
            }
        }
    }

جایی که new ForbidResult() بازگشت داده می شود به صورت پیش فرض شما را به صفحه ذیل ارجاع می دهد.

/Account/AccessDenied?ReturnUrl=%2FAdmin%2FQuestion

که باید اکشن ذیل را در کنترلر Account بنوسیم.

public IActionResult AccessDenied(string returnUrl = "")
        {
            ViewBag.ReturnUrl = returnUrl;
            return View();
        }

که البته با توجه به کدی که در خصوص صفحه 404 توسط جناب آقای مهدوی عزیز نوشته شد، باید برای صفحه 403 Error Forbidden هم اکشن ذیل را در کنترلر Home بنوسیم.

[HttpGet("/403")]
public IActionResult AccessDenied()
{
	return PartialView();
}

حالا در صفحه مدیریت کاربران اگر کاربر دسترسی به نمایش لیست کاربران را نداشت، مستقیم به صفحه عدم دسترسی ارجاع داده می شود. و در اکشن هایی که به صورت نمایش در Modal اقدام شده بود از قبیل افزودن، ویرایش، حذف و دیگر اکشن هایی که شما تصمیم به پیاده سازی با Modal را داشتید از اکشن جداگانه ای که پارشیال عدم دسترسی بر می گرداند به نحو فوق استفاده کنید، که قابل نمایش در خود Modal باشد. 

(این قسمت کد تکرار گذاشته بودم که پاک کردم)

خب خدا رو شکر تا اینجا کارم راه افتاد. ولی همچنان سعی می کنم که این برای عدم دسترسی به صفحه مدیریت کاربران با یک Modal پیغام عدم دسترسی رو انجام بدم.

این کد رو در پروژه دیگری هم استفاده کرده بودم که با توجه به هر Area بتوان به پیغام عدم دسترسی در همان ناحیه ارجاع داده شود.

دوستان عزیز ببخشید اگر طولانی شد. می خواستم نکاتی که فعلا بهشون دست پیدا کردم رو با شما عزیزان به اشتراک بذارم.

روزتون خوش :)


  • 1402/03/17
  • ساعت 09:42

نمونه عدم دسترسی به تغییر آواتار کاربر :

نمونه عدم دسترسی به صفحه مدیریت پرسش ها:

که سعی دارم اینم بصورت مدال نمایش بدم که نمایش قشنگتری رو پیاده کنم.


  • 1402/03/17
  • ساعت 16:09

سلام وقت بخیر

بسیار عالی پیاده سازی کردید و ممنون از نظر ارزشمندتون 🌹

برای بهتر شدن سیستمی که پیاده سازی کردید میتونید برای کنترل دسترسی ها از tag helper ها استفاده کنید.

برای نمایش لینک ها ، دکمه ها و... ساختار چیزی شبیه به این خواهد شد :

<permission-checker name="PERMISSION_NAME">
	ANY HTML CODE HERE
</permission-checker>

که permission-checker تگ هلپر سفارشی هستش که شما میسازید.

با این ساختار Permission مورد نیاز چک میکنه و اگر کاربر جاری دسترسی لازم رو نداشت محتوای تگ اصلا نمایش داده نمیشه

به نوعی اگر کاربر شما مثلا به مدیریت سوالات دسترسی نداره قشنگ تر هستش که اصلا لینک مدیریت سوالات رو نبینه.

دوره ی رایگانی در مورد تگ هلپر ها توی سایت هست که میتونید ازش استفاده کنید :

آموزش ایجاد Tag Helper در Asp Core

 

برای موردی که گفتید میتونید روی رویداد onclick لینک ، دسترسی لازم رو بررسیش کنید. (که پیشنهاد نمیشه کثیف کاری زیادی داره)

و یا میتونید مثل نمایش Notification ها از TempData استفاده کنید مثلا یه همچین چیزی :

public IActionResult ManageQuestions() {
	if (CHECK_IF_NOT_ACCESS) {
		TempData["ShowNotAccessModal"] = true;
		
		// redirect any where like home or dashboard
		return redirect("")
	}
	
	return View();
} 

و در ادامه به صورت کلی و توی Layout خودتون بررسی کنید اگر مقدار TempData["ShowNotAccessModal"] برابر true بود Modal مورد نظر رو نمایش بدید.

موفق و سربلند باشید 🌹


  • 1402/03/17
  • ساعت 17:39

سلام وقت شما هم بخیر، ممنونم لطف دارید

حتما مبحث tag helper ها رو مطالعه میکنم. 

بابت کد آخری که اشاره کردید از نوتیفیکیشن ها استفاده کنم، بررسی می کنم.. البته من دسترسی تمامی کاربران را به بخش پنل مدیریتی بستم، اگر کسی دسترسی لازم رو داشت اجازه داره به این صفحات مورد نظر خود دسترسی داشته باشه.

بعبارتی بالای هر کنترلر در پنل مدیریت [PermissionChecker] رو قرار دادم، که در صورتی که کاربر دسترسی به لیست سوالات نداشت؛ باعث میشه اصلا این اکشن اصلا اجرا نشه!

public IActionResult ManageQuestions() {
	if (CHECK_IF_NOT_ACCESS) {
		TempData["ShowNotAccessModal"] = true;
		
		// redirect any where like home or dashboard
		return redirect("")
	}
	
	return View();
} 

بازم مجدد بیشتر بررسی می کنم. ممنون از وقتی که گذاشتید.

روزتون خوش :)


logo-samandehi