4

我需要允许管理员管理我站点上模型的权限。组、用户和权限现在在这方面做得很好。但是,我还需要允许管理员管理未经身份验证的用户 - 匿名用户的权限。文档说匿名用户的组总是空的,那么我怎样才能允许管理他们的权限呢?

4

2 回答 2

4

给匿名用户添加权限很奇怪。文档说:

Django 的权限框架没有为匿名用户存储权限的地方。但是,它有一个基础,允许自定义身份验证后端为匿名用户指定授权。这对于可重用应用程序的作者特别有用,他们可以将所有授权问题委托给 auth 后端,而不需要设置,例如控制匿名访问。

因此,您可以将权限设置为 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_BACKENDSsettings.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 回答