Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/285.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django—实现授权的最佳方式(基于每个角色以及每个用户)?_Python_Django_Django Views_Django Urls - Fatal编程技术网

Python Django—实现授权的最佳方式(基于每个角色以及每个用户)?

Python Django—实现授权的最佳方式(基于每个角色以及每个用户)?,python,django,django-views,django-urls,Python,Django,Django Views,Django Urls,我正在开发django web应用程序,它需要两种授权: 基于角色(用户不能访问其他角色的URL) 基于用户(相同角色的用户不能访问其他用户的内容) 例如,我们有一个名为HOD(部门负责人)的角色。以下是他们可以访问的一些URL: url(r'^retest/(?P<retest_id>[0-9]+)/$' , views.details, name='details' ), url(r'^retest/(?P<retest_id>[0-9]+)/acce

我正在开发django web应用程序,它需要两种授权:

  • 基于角色(用户不能访问其他角色的URL)
  • 基于用户(相同角色的用户不能访问其他用户的内容)
  • 例如,我们有一个名为HOD(部门负责人)的角色。以下是他们可以访问的一些URL:

        url(r'^retest/(?P<retest_id>[0-9]+)/$' , views.details, name='details' ),
        url(r'^retest/(?P<retest_id>[0-9]+)/accept$' , views.accept, name='accept' ),
        url(r'^retest/(?P<retest_id>[0-9]+)/request$' , views.request, name='request' ),
        url(r'^retest/(?P<retest_id>[0-9]+)/accepted$' , views.accepted, name='accepted' ),
        url(r'^retest/(?P<retest_id>[0-9]+)/retreq$' , views.retreq, name='retreq' )
    
    现在,这些是我所关注的问题,我想对此加以防范:

  • 现在,无论角色如何,任何人都可以查看任何重新测试请求(views.details函数)。我应该如何实现此授权?通过组筛选或使用django中内置的权限系统?这两个角色中的任何一个都意味着我必须修改每个功能(除了HOD之外,还有六个其他用户角色)。最优雅的解决方案是什么

  • 更为棘手的是,某个部门的HOD只需键入带有另一个部门重新测试id的URL,就可以查看其他部门的重新测试请求。这不能通过组筛选来解决。(请注意,HOD还有其他具有不同模型和映射的项)

  • 如果要解决这个问题,我相信我必须检查URL中的内容是否真的属于当前用户&否则,在每个函数开始时重定向。 当前视图中大约有60个函数,分布在不同的用户角色中

    在这两个级别上实现授权最优雅的方式是什么?
    我应该改变URL的设置方式吗?

    我不是专家,但我个人会使用内置的django权限系统。它将解决您的两个问题,您可以使用所需的
    权限
    函数装饰器轻松实现它


    一些有用的提示是:如果您的视图相似并且希望保持干燥,可以考虑使用基于类的视图而不是基于函数的视图,并且可以在URL模式本身(在URL.py中)而不是视图函数上使用装饰器。

    权限可以解决基于角色的身份验证问题。但是基于用户的身份验证呢?我是否需要在每个函数中编写额外的身份验证代码?@AllenGJ您可以在每个函数中编写身份验证代码,但我认为创建自己的自定义权限可能是更好的选择。
    @login_required
    def details(request, retest_id):
        try:
            retest= Retest.objects.get(pk=retest_id)
        except Retest.DoesNotExist:
            raise Http404("Request does not exit")
        return render(request, 'retest/details.html' , { 'retest': retest })
    
    @login_required
    def accept(request, retest_id):
        retest = get_object_or_404(Retest, pk=retest_id)
        # update is_hod attribute only if the request is a POST.
        if request.method == 'POST':
            retest.is_hod = True
            retest.save(update_fields=['is_hod'])
        return render(request, 'retest/details.html' , {'retest': retest})