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