Django - 匿名用户组

时间:2012-07-03 18:32:40

标签: django

我需要允许管理员管理我网站上的模型的权限。群组,用户和权限现在正在做得很好。但是,我还需要允许管理员管理未经身份验证的用户 - 匿名用户的权限。文档说匿名用户的组总是空的,那么如何才能允许管理他们的权限?

2 个答案:

答案 0 :(得分:4)

向匿名用户添加权限很奇怪。 Docs说:

  

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

但这是我永远不会使用的东西..

答案 1 :(得分:0)

我已经使用自定义后端提供匿名组(如@Tisho suggests),可以从管理界面轻松编辑。将以下课程添加到AUTHENTICATION_BACKENDS中的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)