【问题标题】:Adding specific permission to users with different roles in django在 django 中为具有不同角色的用户添加特定权限
【发布时间】:2017-11-21 09:58:33
【问题描述】:

我是 django 的新手,我对权限的工作方式有点困惑,或者这是否是我应该在我的情况下使用的。

所以,我有我的用户/模型:

from django.db import models
from django.contrib.auth.models import AbstractUser
class User(AbstractUser):
  ROLE_CHOICES = (
        (0, ('Student')),
        (1, ('Proffesor')),
        (2, ('Administration'))
     )
role = models.IntegerField(choices=ROLE_CHOICES, default=2)

然后我在选举/views.py 中有我的观点:

class MainPage(View)

class ElectionList(LoginRequiredMixin, View)

class ElectionDetail(LoginRequiredMixin, View)

#only administration can create elections
class CreateElection(LoginRequiredMixin, CreateView)

如何限制简单用户(例如学生)创建选举?

【问题讨论】:

    标签: python django user-roles


    【解决方案1】:

    我的解决方案可能是 Django 的装饰器的替代方案。 你的问题我很感兴趣。

    当我的视图中有函数并且我不想将这个函数显示给用户组时,我有一个模板标签文件:

    from django import template
    from django.contrib.auth.models import Group 
    
    register = template.Library() 
    
    @register.filter(name='has_group') 
    def has_group(user, group_name):
        group =  Group.objects.get(name=group_name) 
        return group in user.groups.all() 
    

    然后,在我的 HTML 文件中:

    {% if request.user|has_group:"admin" %}
       <li><a href="{% url "edited" %}">Some part</a></li>
    {% endif %}
    

    我认为可以在我的模板标签中直接在我的 views.py 文件中获得用户权限,但我不知道该怎么做。 无论如何,到目前为止,我的方法效果很好;)

    【讨论】:

      【解决方案2】:

      【讨论】:

        【解决方案3】:

        您可以使用UserPassesTestMixin

        例如,

        class LoginAndPermission(LoginRequiredMixin, UserPassesTestMixin):
            def test_func(self):
                return self.request.user.is_student
        
            def get_login_url(self):
                if self.request.user.is_authenticated():
                    # User is logged in but does not have permission
                    return "/permission-denied-url/"
                else:
                    # User is not logged in
                    return "/login/"
        
        class ElectionDetail(LoginAndPermission, View):
        

        【讨论】:

          【解决方案4】:
          from django.contrib.auth.mixins import AccessMixin
          class AddElectionPermission(AccessMixin):
              raise_exception = True
              permission_denied_message = 'permission deny'
          
              def dispatch(self, request, *args, **kwargs):
                  if request.user.role != 0:
                      return self.handle_no_permission()
                  return super(AddElectionPermission, self).dispatch(request, *args, **kwargs)
          
          #only administration can create elections
          class CreateElection(LoginRequiredMixin, AddElectionPermission, CreateView)
          

          【讨论】:

            【解决方案5】:

            Django 已经有一个Permission and Group models and per-group permissions,,所以这里最简洁的“django 兼容”方式是将“学生”、“教授”和“管理员”定义为组,设置他们的权限(如果需要,最终添加自定义权限),添加您的用户到适当的组,并使用permission_required decorator 或因为您使用基于类的视图the PermissionRequiredMixin 测试您的当前用户是否具有给定操作所需的权限。

            附带说明:由于您将 ints 用于您的 role 值,您可能需要在模型中为它​​们添加 pseudo_constants:

            class User(AbstractUser):
              ROLE_STUDENT = 0
              ROLE_PROFESSOR = 1
              ROLE_ADMINISTRATOR = 2
            
              ROLE_CHOICES = (
                    (ROLE_STUDENT, 'Student'),
                    (ROLE_PROFESSOR, 'Professor'),
                    (ROLE_ADMINISTRATOR, 'Administration')
                 )
            

            因此您可以使用合理的人类可读值而不是幻数来查询/过滤您的模型,即:

            students = User.objects.filter(role=User.ROLE_STUDENT)
            

            而不是

            students = User.objects.filter(role=0)
            

            但如果您使用contrib.auth.models.Group 获取权限,您甚至可能根本不需要此字段,因为您可以从组成员那里获取您的查询集。

            【讨论】:

              猜你喜欢
              • 2020-05-14
              • 2019-01-26
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2014-05-16
              • 2011-06-12
              • 2011-09-09
              • 1970-01-01
              相关资源
              最近更新 更多