3

Django プロジェクトでオブジェクトごとの権限を実装するために django-guardian を使用しています。匿名ユーザーが表示できるオブジェクトを登録ユーザーが表示できないという問題が発生しました。私は、匿名ユーザーが許可を持っている場合、登録ユーザーも同じ許可を持っているべきだと考えていました (匿名ユーザーが何かを実行できるようにして、登録ユーザーが実行できないようにする私の Web サイトの一部を想像することはできません)。何かをする)。

from core.models import MyObject
from django.contrib.auth.models import User
from guardian.shortcuts import 
from guardian.utils import get_anonymous_user
m = MyObject.objects.get(id=1)
u = User.objects.get(username="MyUser")
anon = get_anonymous_user()
anon.has_perm('view_object', m)
# ^ Prints True
u.has_perm('view_object', m)
# ^ Prints False

私のプロジェクトには、「パブリック」または「プライベート」にできるオブジェクトがいくつかあります。ユーザーがオブジェクトを「公開」としてマークすると、匿名ユーザーに「view_object」権限が付与されます。PermissionRequiredMixin私のビューは、次のようにを使用して保護されています。

class MyObjectDetailsView(PermissionRequiredMixin, DetailView):
    model = MyObject
    permission_required = 'view_object'

Django Guardian は、登録ユーザーに匿名ユーザーと同じ権限を与える方法を提供していますか? あるいは、PermissionRequiredMixin をサブクラス化して、ユーザーには権限がなく、匿名ユーザーには権限がある場合にアクションを許可する方法があるのでしょうか?

4

1 に答える 1

2

次のように PermissionRequiredMixin をサブクラス化することで回避策を見つけました。

from guardian.mixins import PermissionRequiredMixin
from guardian.utils import get_anonymous_user


class PermissionRequiredMixinWithAnonymous(PermissionRequiredMixin):
    def check_permissions(self, request):
        forbidden = super(PermissionRequiredMixinWithAnonymous, self).check_permissions(request)
        if forbidden:
            perms = self.get_required_permissions(request)
            anon = get_anonymous_user()
            obj = self.get_permission_object()
            has_permissions = all(anon.has_perm(perm, obj) for perm in perms)
            if has_permissions:
                forbidden = None
        return forbidden

ログインしたユーザーの権限チェックが失敗した場合 (これは への呼び出しですsuper())、チェックは基本的に匿名ユーザーに対して再実行されます。if forbidden:ブロック内のコードはPermissionRequiredMixin.check_permissionsand guardian.utils.get_403_or_None(後者は前者から呼び出されます) に基づいています。check_permissionsと の両方をget_403_or_None使用するため、このようにする必要がありましたrequest.user

于 2016-01-15T01:21:04.873 に答える