使用 django-guardian 进行基于角色的访问

Posted

技术标签:

【中文标题】使用 django-guardian 进行基于角色的访问【英文标题】:role based access using django-guardian 【发布时间】:2013-03-16 14:34:58 【问题描述】:

我使用 django-guardian 提供基于角色的权限,使用 django-userena 进行用户分析。我有三种用户管理员,子管理员,员工。管理员可以添加子管理员,子管理员可以添加员工。我为三种用户类型创建了三个监护人组。当用户注册时,我为该用户分配一个员工组。

class Profile(UserenaBaseProfile):
    class Meta:
    permissions = ( 
                ( "add_admin", "Can add admin" ),
                ( "add_subadmin", "Can add sub admin" ),
                ( "add_employee", "Can add employee" ),
            )
    user = models.OneToOneField(User,
                            unique=True,
                            verbose_name='user',
                            related_name='profile')
    first_name = models.CharField('First name',max_length=100,blank=False,null=False)
    def save(self, *args, **kwargs):
        super(Profile, self).save(*args, **kwargs)
        employee_group = Group.objects.get('employee')
        self.groups.add(employee_group)

我想使用 Django Admin 并赋予 Admin 和 sub-admin 更改用户组的能力。

如何使用 AdminModel 在管理面板中添加下拉菜单或单选按钮,以便更改用户组。或者有没有更好的方法来做到这一点。

【问题讨论】:

【参考方案1】:

您正在寻找Admin actions,您必须编写一些自定义管理操作。

更新

当您创建管理员时,您可以检查当前request.user 是否能够看到该操作。我们可以说,如果用户不是管理员,那么自定义操作方法应该返回 None 或只是 pass。在代码中的任何地方都有一个用于获取当前用户的应用程序,当您无权访问当前用户请求时,它被称为django-cuser。它适用于您需要确定用户是管理员还是子管理员才能为他提供自定义操作的情况。

Conditionally enabling or disabling actions开始

【讨论】:

感谢您向我推荐管理员操作。但是,如果我创建任何管理员操作,那么它对每种类型的用户都是可见的。例如,我有三个动作 make_admin、make_sub_admin 和 make_employee。所有这三个都应该对管理员类型的用户可见。子管理员用户只能看到 mak_sub_admin 和 make_employee 操作。我怎样才能做到这一点。我想使用默认的管理模板,不想编写自定义模板。

以上是关于使用 django-guardian 进行基于角色的访问的主要内容,如果未能解决你的问题,请参考以下文章

如何根据 HTTP 请求方法使用 Apache Shiro 进行基于角色的授权

使用 IdentityServer4 对 Web API 进行基于角色的授权

使用 express-jwt 进行基于角色的授权?

使用 Keycloak 和 .NET 核心的基于角色的授权

如何使用 Identity Server 4 (JWT) 进行基于角色的 Web API 授权

基于角色的 jwt 授权