• 1404/02/23

بومی سازی وب اپ بر اساس نوع اشتراک خریداری شده :

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

حال فرض کنید کاربر از نوع OWNER با توجه به نوع اشتراکِی که خریداری کرده  میخواهیم دسترسی به اجزای سایت رو هم به صورت بصری و هم امنیتی محدود کنیم. (یعنی محدود کردن دیدن منو ها و کار کردن ویو ها هم بر اساس نوع کاربر و هم بر اساس نوع اشتراک خریداری شده)

فک کنید که گروه کاربری فرد خریدار OWNER باشه و ما دسترسی های فول بهش دادیم. اما میخواهیم اگر Plan1 رو خرید منوها و امکانات محدود بدهیم و اگر Plan2 رو خرید امکانات و منوهای بیشتر و اگر Plan3 رو خرید فول امکانات رو بهش بدیم.

این کار باید هم در نمایش منو ها باشه هم در دسترسی به ویو ها (که اگر آدرس URL رو میدونست نتونه استفاده کنه)

من فک کردم که با تغییر در دسترسی ها این موضوع رو هندل کنم ولی به نظر درست نیست چون کاربر عضو گروه OWNER هست و دسترسی ها به گروه داده شده در سطح کلیِ APP و ممکنه یک OWNER دیگه plan متفاوتی خریده باشه. یا بیام چند تا گروه کاربری OWNER بزارم مثلا PLAN1OWNER و ... که بازم صحیح نیست چون ممکنه plan ها بیشتر بشه.
میشه بنده رو رهنمایی کنید؟
بینهایت سپاسگزارم

  • 1404/02/23
  • ساعت 21:20

سلام خدمت شما دوست عزیز

ببینین برای کنترل کردن دسترسی به 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 ایجاد کنین

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


logo-enamadlogo-samandehi