在django中为具有不同角色的用户添加特定权限

时间:2017-06-19 09:01:03

标签: python django user-roles

我是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)

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

5 个答案:

答案 0 :(得分:2)

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

作为旁注:由于您使用ints作为role值,因此您可能希望在模型中为它​​们添加伪余量:

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获取权限,则根本不需要此字段,因为您可以从组成员中获取您的查询集。

答案 1 :(得分:1)

您可以使用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):

答案 2 :(得分:0)

我的解决方案可以替代Django的装饰器。 我的问题非常有趣。

当我在我的观看中有功能并且我不想将这个显示给用户组时,我有一个templatetags文件:

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文件中获得用户权限,但我不知道如何做到这一点。 无论如何,到目前为止,我的方法运作良好;)

答案 3 :(得分:0)

答案 4 :(得分:0)

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)