4

管理者が自分のサイトのモデルの権限を管理できるようにする必要があります。グループ、ユーザー、およびアクセス許可は、現在これをうまく行っています。ただし、管理者が認証されていないユーザー(匿名ユーザー)のアクセス許可を管理できるようにする必要もあります。ドキュメントには、匿名ユーザーのグループは常に空であると書かれていますが、どうすればユーザーのアクセス許可の管理を許可できますか?

4

2 に答える 2

4

匿名ユーザーに権限を追加するのは奇妙です。ドキュメントによると:

Djangoの権限フレームワークには、匿名ユーザーの権限を保存する場所がありません。ただし、カスタム認証バックエンドが匿名ユーザーの承認を指定できるようにする基盤があります。これは、たとえば匿名アクセスを制御するための設定を必要とせずに、承認に関するすべての質問を認証バックエンドに委任できる再利用可能なアプリの作成者にとって特に便利です。

したがって、anon yuserに権限を設定できますが、カスタム認証バックエンドを使用します。次のように、必要なアクセス許可を持つビューでデコレータを使用して、宣言型のアクセス許可チェックを使用する方がよい場合があります。

@permission_required('somemodel.can_add')
def add_model(request):

または、すべてのユーザー(匿名ユーザーを含む)に対して無制限のままにします。または、カスタム権限チェック。

または、とにかくアクセス許可が必要な場合は、いつでもダミーユーザー(たとえば「AnonUser」)を作成してアクセス許可を付与し、アクセス許可をチェックして次のようにすることができます。

if not user.is_authenticated():
    dummy_user = User.objects.get(name="AnonUser")
    if dummy_user.has_perm("somepermission"):
        # bla bla bla

しかし、これは私が決して使用しないものです。

于 2012-07-03T18:41:09.560 に答える
1

私はカスタムバックエンドを使用して匿名グループを提供しました(@Tishoが提案しているように)。これは管理インターフェイスから簡単に編集できます。AUTHENTICATION_BACKENDS次のクラスをinに追加しますsettings.py(例'appname.auth_backend.AnonymousPermissions')。

権限をチェックする前にログインを要求するのが一般的であることに注意してください(たとえば、login_required)。これは、権限のみのチェックに置き換える必要があります。

from django.contrib.auth.models import Group

class AnonymousPermissions(object):

    def get_anonymous_permissions(self):
        #largely from django.contrib.auth.backends
        group, group_created = Group.objects.get_or_create(name='Anonymous')
        perms = group.permissions.all()
        perms = perms.values_list('content_type__app_label', 'codename').order_by()
        perms = set("%s.%s" % (ct, name) for ct, name in perms)
        return perms

    def get_group_permissions(self, user_obj, obj=None):
        if user_obj.is_anonymous:
            perm_cache_name = '_anonymous_perm_cache'
            if not hasattr(user_obj, perm_cache_name):
                setattr(user_obj, perm_cache_name, self.get_anonymous_permissions())
            return getattr(user_obj, perm_cache_name)
        return set()

    def get_all_permissions(self, user_obj, obj=None):
        return self.get_group_permissions(user_obj, obj)

    def has_perm(self, user_obj, perm, obj=None):
        return perm in self.get_group_permissions(user_obj, obj)
于 2015-07-20T15:44:00.743 に答える