permission_required装饰工作不适合我(permission_required de

2019-08-01 02:57发布

我想不通为什么所需的权限装饰是行不通的。 我想只允许访问对工作人员的视图。 我试过了

@permission_required('request.user.is_staff',login_url="../admin")
def series_info(request):
  ...

并且

@permission_required('user.is_staff',login_url="../admin")
def series_info(request):
  ...

作为超级用户,我可以访问视图,但任何用户创建的人员不能访问它,并重定向到登录页面的URL。 我测试的login_required装饰和工作正常。

Answer 1:

permission_required()必须传递许可名称,而不是在一个字符串Python表达式。 试试这个:

from contrib.auth.decorators import user_passes_test
def staff_required(login_url=None):
    return user_passes_test(lambda u: u.is_staff, login_url=login_url)

@staff_required(login_url="../admin")
def series_info(request)
...

谢谢。 这确实工作。 你有如何使用permission_required的例子吗? 从文档docs.djangoproject.com/en/1.0/...和djangobook.com/en/2.0/chapter14我认为我有什么应该工作。

重新阅读您发布的链接; permission_required()如果用户已被授予特定权限将测试。 它不测试用户对象的属性。

从http://www.djangobook.com/en/2.0/chapter14/ :

def vote(request):
    if request.user.is_authenticated() and request.user.has_perm('polls.can_vote'):
        # vote here
    else:
        return HttpResponse("You can't vote in this poll.")

   #
   #
 # # #
  ###
   #

def user_can_vote(user):
    return user.is_authenticated() and user.has_perm("polls.can_vote")

@user_passes_test(user_can_vote, login_url="/login/")
def vote(request):
    # vote here

   #
   #
 # # #
  ###
   #

from django.contrib.auth.decorators import permission_required

@permission_required('polls.can_vote', login_url="/login/")
def vote(request):
    # vote here


Answer 2:

这是我会怎么做:

from django.contrib.admin.views.decorators import staff_member_required

@staff_member_required
def series_info(request):
    ...

文档说约staff_member_required:

装饰的观点,即检查该用户登录,并且是工作人员,如果有必要显示登录页面。



Answer 3:

这里是行为我不明白的例子。 我创建用户,请求和装饰用permission_required检查关于“is_staff”一个测试功能。 如果用户是超级用户,则授予访问权限的测试功能。 如果用户只is_staff = TRUE,并且不授予权限。

from django.http import HttpRequest
from django.contrib.auth.models import User
from django.contrib.auth.decorators import permission_required

@permission_required('is_staff')
def test(dummy='dummy'):
    print 'In test'

mb_user = User.objects.create_user('mitch', 'mb@home.com', 'mbpassword')
mb_user.is_staff = True

req = HttpRequest()
req.user = mb_user

test(req) # access to test denied - redirected

req.user.is_staff = False

test(req) # same as when is_staff is True

req.user.is_superuser = True
test(req) # access to test allowed


Answer 4:

顺便说一句,如果你正在使用基于类的意见,你应该换你的装饰在method_decorator装饰(去图):

class MyView(DetailView):
    ...
    @method_decorator(permission_required('polls.can_vote', login_url=reverse_lazy('my_login')))
    def dispatch(self, request, *args, **kwargs):
        .... blah ....

class MyModel(models.Model):
    ...
    def has_perm(self perm, obj=None):
        if perm == 'polls.canvote':
            return self.can_vote()


Answer 5:

这对我的作品在我的“项目”表/型号:

@permission_required('myApp.add_project')
def create(request):
    # python code etc...

显然,改变add_project到add_ [无论你的模型/表。 编辑那就是:

@permission_required( 'myApp.edit_project')

并删除:

@permission_required( 'myApp.delete_project')

但我发现,关键是要确保您的身份验证表的设置是否正确。 这是什么原因造成了我的问题。 下面是一个MySQL的SQL查询我写的,如果你正在使用组来检查的权限。 这应该在大多数分贝的工作:

select usr.id as 'user id',usr.username,grp.id as 'group id',grp.name as 'group name',grpu.id as 'auth_user_groups',grpp.id as 'auth_group_permissions',perm.name,perm.codename
from auth_user usr
left join auth_user_groups grpu on usr.id = grpu.user_id
left join auth_group grp on grpu.group_id = grp.id
left join auth_group_permissions grpp on grp.id = grpp.group_id
left join auth_permission perm on grpp.permission_id = perm.id
order by usr.id;

我发现我的权限没有设置正确,并注意其必须为每个应用程序和表中的每个添加,编辑的行django_content_type表,删除。 所以,如果你有一个项目表,你应该在django_content_type看到这一点:

id           [generated by dB]
app_label    myApp
model        project

如果您有麻烦的另一个好主意是启用并使用Django管理应用程序。 这将显示您的问题,并通过设置一些测试权限,用户和组便可以检查上面所讨论的看到被插入什么地方的表。 这会给你的权限是如何工作的权威性是个好主意。

我写这也许救一个人不必花几个小时搞清楚什么我做到了!



文章来源: permission_required decorator not working for me