سلام استاد وقت بخیر
فرض کنید یک وب اپ تهیه کردیم که انواع کاربر با دسترسی های متفاوت در آن میتوانند کار کنند و میخواهیم با توجه به نوع کاربر دسترسی به اجزای سایت رو هم به صورت بصری و هم امنیتی محدود کنیم. این کار رو قبلا با راهنمایی شما و با ایجاد دسترسی در گروه انجام دادم و هم دیسپلی منو و هم امنیت ویو در کنترل است.
حال فرض کنید کاربر از نوع OWNER با توجه به نوع اشتراکِی که خریداری کرده میخواهیم دسترسی به اجزای سایت رو هم به صورت بصری و هم امنیتی محدود کنیم. (یعنی محدود کردن دیدن منو ها و کار کردن ویو ها هم بر اساس نوع کاربر و هم بر اساس نوع اشتراک خریداری شده)
فک کنید که گروه کاربری فرد خریدار OWNER باشه و ما دسترسی های فول بهش دادیم. اما میخواهیم اگر Plan1 رو خرید منوها و امکانات محدود بدهیم و اگر Plan2 رو خرید امکانات و منوهای بیشتر و اگر Plan3 رو خرید فول امکانات رو بهش بدیم.
این کار باید هم در نمایش منو ها باشه هم در دسترسی به ویو ها (که اگر آدرس URL رو میدونست نتونه استفاده کنه)
من فک کردم که با تغییر در دسترسی ها این موضوع رو هندل کنم ولی به نظر درست نیست چون کاربر عضو گروه OWNER هست و دسترسی ها به گروه داده شده در سطح کلیِ APP و ممکنه یک OWNER دیگه plan متفاوتی خریده باشه. یا بیام چند تا گروه کاربری OWNER بزارم مثلا PLAN1OWNER و ... که بازم صحیح نیست چون ممکنه plan ها بیشتر بشه.
میشه بنده رو رهنمایی کنید؟
بینهایت سپاسگزارم
سلام خدمت شما دوست عزیز
ببینین برای کنترل کردن دسترسی به view ها شما باید یک decorator ایجاد کنین مثل login_required که دسترسی های لازم رو با این decorator اعمال کنین
این یک نمونه کد برای decorator هستش که سطح دسترسی رو چک میکنه :
def permission_checker(*args, **kwargs):
title = kwargs.get('title')
system_name = kwargs.get('system_name')
group_name = kwargs.get('group_name')
group_verbose_name = kwargs.get('group_verbose_name')
redirect_path = kwargs.get('redirect_path', '/')
only_superuser = kwargs.get('only_superuser') or False
# create new instance for Permission to manage all permissions in admin
Permission(title=title, system_name=system_name, group_name=group_name, group_verbose_name=group_verbose_name)
def permission_dec(fun):
def wrapper(*dec_args, **dec_kwargs):
# request is essential to process permission checker
if not isinstance(dec_args[0], HttpRequest):
if not isinstance(dec_args[1], HttpRequest):
raise ValueError('Request should be send to permission checker')
else:
request = dec_args[1]
else:
request = dec_args[0]
# check user is logged in
if request.user.is_authenticated:
# check superuser permission
if request.user.is_superuser:
return fun(*dec_args, **dec_kwargs)
if not only_superuser:
# if user is super_user or has permission, can see the page
if system_name in request.user.permissions or request.user.is_owner:
return fun(*dec_args, **dec_kwargs)
else:
messages.warning(request, _('You dont have permission to visit this page'))
return redirect(redirect_path)
else:
return HttpResponse('', status=404)
else:
messages.warning(request, _('Please login to your account'))
return redirect(redirect_path)
return wrapper
return permission_dec
روش استفاده هم به این صورت هستش :
@method_decorator(Permission.permission_checker(system_name='permission', title='Title', group_name='system_name', group_verbose_name='Group system name', 'dispatch')
class CustomView(View):
pass
البته این کد یک نمونه هستش و شما باید خودتون بنا به نیاز خودتون یک decorator ایجاد کنین
این مثال برای شما به صورت کامل قابل استفاده نیست