【问题标题】:I need has_perm() example for AbstractBaseUser in django我需要 django 中 AbstractBaseUser 的 has_perm() 示例
【发布时间】:2021-11-03 10:23:04
【问题描述】:

我有一个自定义用户模型,我需要向具有某些角色(用户模型中的字段)的用户授予权限,但我在 Internet 上找不到任何示例,所以我向任何拥有此权限的人询问示例以前做过。这是我的抽象用户模型供参考:

class User(AbstractBaseUser, PermissionsMixin):
    
    class RoleChoices(models.TextChoices):
        admin = 'Admin', _('Admin')
        cashier = 'Cashier', _('Cashier')
        waiter = 'Waiter', _('Waiter')
        courier = 'Courier', _('Courier')
        customer = 'Customer', _('Customer')
    
    username = models.CharField(_('username'), unique=True, max_length=100)
    name = models.CharField(_('name'), max_length=100)
    surname = models.CharField(_('surname'), max_length=100)
    phone_number = models.CharField(_('phone_number'), max_length=100, null=True, default='Invalid Phone Number')
    role = models.CharField(max_length=50, choices=RoleChoices.choices, default=RoleChoices.customer)
    active = models.BooleanField(default=True)
    date_joined = models.DateTimeField(auto_now_add=True)

    USERNAME_FIELD = 'username'
    REQUIRED_FIELDS = ['name', 'surname']

    class Meta:
        ordering = ['date_joined', ]

    def __str__(self):
        return self.username

    def has_perm(self, perm, obj=None):
        return True

    def has_module_perms(self, app_label):
        return True

    @property
    def is_active(self):
        return self.active

    objects = CustomUserManager()

提前致谢,如有语法错误,敬请原谅。

【问题讨论】:

    标签: python-3.x django authentication permissions


    【解决方案1】:

    要为给定模型对象创建自定义权限,请使用Meta 类的permissions 属性。

    class User(AbstractBaseUser, PermissionsMixin):
        ...
        class Meta:
            permissions = [
                ("change_role", "Can change the role of user"),
                # Others customs permissions if needed
            ]
    

    如果您现在想检查用户是否有权更改角色,那么: .py 文件中的user.has_perm('app.change_role') app 是定义模型的应用的名称。

    在模板文件(.html)中 当前记录的用户权限已存储在{{ perms }} 模板变量中。如下使用:

    {% if perms.app_label.change_role %}
        <!-- Show whatever you need here -->
    {% endif %}
    

    注意:这需要启用以下上下文处理器:django.contrib.auth.context_processors.auth

    另请注意,如果您以超级用户身份登录perms.app_label.foobar 将始终为真,即使您拼错了权限名称。

    另外,如果您想查看用户由于所属组而拥有的所有权限,请启动 Django shell...

    user = User.objects.get(username='somename')
    user.get_group_permissions()
    

    如果您想添加视图级别权限

    from django.contrib.auth.decorators import permission_required
    from django.contrib.auth.decorators import login_required
    
    # Only user with app_name.change_role can access this url
    @permission_required('app_name.change_role')
    # Also protect the view with authenticated user
    @login_required(login_url='/accounts/login/')
    def my_protected_view(request):
        # Do your secrets things here
    

    【讨论】:

    • 首先,感谢您的详细回答,这对了解发生了什么有很大帮助。我在定义用户使用 has_perm() 或 has_perms() 的权限时遇到问题,我想使用角色字段来分配任何权限。
    • 我想帮助你,但我不明白你的问题!目标是什么?简单
    • 我想限制服务员和收银员用户访问一些可以更改数据库数据的页面。我只想为此授权管理员。
    • 怎么样,我明白了。为此,您可以在模板中定义一些 urls 链接,如下所示:{% if user.is_staff %} &lt;a href="{% url 'only_admin_url' %}"&gt;&lt;/a&gt; {% endif %}。请注意,您可以使用 is_staff 来检查用户是否具有管理员权限或 is_superuser 是否拥有所有权限。 Django user model documentation
    • 我用views level permissions更新了答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-06-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多