【15.0】DRF之权限控制
【一】ACL的权限控制
- ACL(访问控制列表)是一种用于权限控制的技术,可以限制用户对系统资源的访问和操作。
- 在针对互联网用户的产品中,ACL被广泛应用于管理用户对特定功能或数据的权限。
- ACL(访问控制列表)的权限控制:(针对互联网用户的产品)
用户表
id name password
1 zhangsan 123
权限表
id user_id 权限
1 1 评论权限
2 1 发抖音权限
张三:[评论权限,发抖音权限]
- 在给出的示例中,存在一个用户表和一个权限表,以及一个用户张三。
- 用户表包含用户的基本信息,如ID、用户名和密码。
- 权限表包含了权限的信息,包括ID、用户ID和具体权限名称。
- 根据权限表中的记录
- 我们可以得知张三具有评论权限和发抖音权限。
- 这意味着张三可以评论和发抖音。
- ACL的工作原理是对每个用户进行身份认证,并根据其身份分配相应的权限。
- 当用户尝试执行某个操作时,系统会通过检查ACL来确定该用户是否具有执行该操作的权限。
- 如果用户具有相应的权限,则操作将被允许;否则,将被拒绝。
- ACL能够有效地管理用户对系统资源的访问权限,帮助确保只有授权用户可以执行特定的操作。
- 通过仔细设计和配置ACL,可以保护系统的安全性,并防止未经授权的访问和滥用。
【二】RBAC基于角色的访问控制
RBAC(Role-Based Access Control)基于角色的访问控制:(针对于公司内部项目)
权限与角色相关联,用户通过成为适当角色的成员而得到这些角色的权限。
- 这就极大地简化了权限的管理。
- 这样管理都是层级相互依赖的,权限赋予给角色,而把角色又赋予用户,这样的权限设计很清楚,管理起来很方便
django的auth其实就实现了基于角色的访问控制 ---> 通过表控制的
auth_user
:用户表,存用户信息
auth_group
:组,角色,存放角色信息
auth_permission
:权限,存放权限信息
- 分析:一个组(角色)中,有多个用户,一个用户,属于多种角色----》多对多
auth_user_groups
:用户和组的多对多中间表
- 分析:一个组,可能有多个权限,一个权限,也可能属于多个组---》多对多
auth_group_permissions
:组和权限的多对多中间件
- django,多了张表:
auth_user_user_permissions
- 分析:一个用户,可以有多个权限,一个权限,可以分配个多个用户---》多对多
auth_user_user_permissions
:用户和权限多对多中间表
-
基于角色的访问控制(Role-Based Access Control,RBAC)是一种常用的访问控制策略,它将权限与角色相关联,通过将用户分配到适当的角色,来获得该角色所具有的权限。
-
这种访问控制方式简化了权限的管理,提高了系统的安全性和可管理性。
-
在RBAC中,主要涉及以下几个表:
-
auth_user
:-
存储用户信息的表。
-
每个用户在系统中有唯一标识,并包含其登录凭证、个人信息等。
-
-
auth_group
:-
存储角色(组)信息的表。
-
每个角色代表一组具有相似职能或权限的用户集合。
-
例如,可以定义一个"管理员"角色和一个"普通用户"角色。
-
-
auth_permission
:-
存储权限信息的表。
-
每个权限对应系统中的具体操作或资源,如"添加用户"、"编辑数据"等。
-
-
auth_user_groups
:-
用户与组之间的多对多关系表。
-
通过该表,将用户分配给不同的角色(组)。
-
-
auth_group_permissions
:-
组与权限之间的多对多关系表。
-
通过该表,将权限授予不同的角色(组)。
-
-
auth_user_user_permissions
:- 用户与权限之间的多对多关系表。
- 通过该表,将权限直接赋予特定的用户。
-
-
使用上述表,可以实现基于角色的访问控制。具体步骤如下:
-
定义角色:
- 创建
auth_group
表中的记录,定义不同的角色(组),如"管理员"、"普通用户"等。
- 创建
-
确定权限:
- 创建
auth_permission
表中的记录,定义系统中的各项权限,如"添加用户"、"编辑数据"等。
- 创建
-
分配角色:
- 通过在
auth_user_groups
表中创建相应的记录,将用户分配到对应的角色(组)。
- 通过在
-
授予权限:
- 通过在
auth_group_permissions
表中创建记录,将权限授予不同的角色(组)。
- 通过在
-
直接赋权:
- 通过在
auth_user_user_permissions
表中创建记录,将权限直接授予特定的用户。
- 通过在
-
-
这样,当用户登录系统时,系统会检查该用户所分配的角色,并根据角色所拥有的权限来限制用户的操作范围。
-
通过RBAC的机制,可以灵活地管理和控制用户的权限,实现安全的访问控制。
-
在Django框架中,
django.contrib.auth
模块提供了RBAC相关的数据模型和方法,方便进行基于角色的访问控制的实现。
【三】Django中的权限控制是如何使用的
【1】定义权限:
- 首先,您需要定义应用程序中的权限。
- 这可以通过在 models.py 文件中使用 Django 的
Permission
类来完成。 - 您可以为每个视图或特定操作定义自己的权限。
from django.contrib.auth.models import Permission
class MyModel(models.Model):
# 模型字段定义
class Meta:
permissions = [
("can_view_mymodel", "Can view My Model"),
("can_change_mymodel", "Can change My Model"),
]
【2】授予权限:
- 一旦您定义了权限,您需要将其分配给相应的用户角色或具体的用户。
- 这可以通过 Django 管理界面或程序代码的方式来完成。
- 对于管理员用户,您可以在创建用户时直接选择用户的权限。
from django.contrib.auth.models import User, Group
from django.contrib.auth.models import Permission
# 创建用户组
group = Group(name='Editors')
group.save()
# 给用户组分配权限
permission = Permission.objects.get(codename='can_view_mymodel')
group.permissions.add(permission)
# 创建用户并关联用户组
user = User.objects.create_user('john', 'john@example.com', 'password')
user.groups.add(group)
【3】验证权限:
- 在视图函数或类中,您可以使用 Django 提供的装饰器或 mixin 来验证用户是否具有执行特定操作的权限。
- 使用装饰器:
from django.contrib.auth.decorators import permission_required
@permission_required('app.can_view_mymodel')
def my_view(request):
# 视图函数逻辑
- 使用 mixin 类:
from django.contrib.auth.mixins import PermissionRequiredMixin
class MyView(PermissionRequiredMixin, View):
permission_required = ('app.can_change_mymodel',) # 可以是单个权限或多个权限元组
def get(self, request):
# 视图类逻辑
【4】模板中的权限控制:
- 在模板文件中,您可以使用 Django 提供的模板标签来控制用户对特定内容的访问权限。
{% if perms.app.can_change_mymodel %}
<a href="#">Edit</a>
{% endif %}
- 通过以上步骤,您可以使用 Django 中的权限控制系统来管理用户对应用程序资源的访问和操作权限。
- 请注意,这只是一个基本示例,您还可以根据具体的应用需求进行进一步的自定义和扩展。
【四】开发中如何做权限控制
python开发,公司内部项目多,使用基于角色的访问控制的权限,比较多
python+django 开发出一套公司内部项目,要带rbac的权限控制
- 基于django的auth+admin 快速开发,有更多操作,但是没学
- 基于django的auth+admin+第三方美化 快速开发
- 国内的:simple-ui,xadmin(弃用了)
- 国外的:
- 基于django+vue+自定制权限
- djagno-vue-admin :第三方开源
- 完全自己写
-
在Python开发中,实现权限控制通常可以使用基于角色的访问控制(Role-Based Access Control,RBAC)。
-
以下是一些在Python开发中实现RBAC权限控制的方法:
-
基于Django的auth+admin快速开发:
-
Django框架本身提供了内置的用户认证(auth)和管理后台(admin)功能,可通过对用户、组和权限进行管理来实现RBAC。
-
可以使用Django提供的装饰器和权限类来限制用户的访问和操作权限。
-
-
基于Django的auth+admin+第三方美化快速开发:
- 为了增强管理后台的样式和功能,可以使用一些第三方库来进行美化,如国内的simple-ui、xadmin(已弃用)以及国外的其他选择。
-
基于Django+Vue+自定制权限:
- 结合Django和Vue框架,使用自定义的权限控制方式来实现更加灵活的权限控制机制。一个可行的方案是使用第三方库如django-vue-admin,支持自定义权限的分配和管理。
-
完全自己写:
- 如果需要更加细粒度的权限控制或者与其他系统进行深度集成,可以根据具体需求完全自己编写权限控制模块。
-
-
总之,在选择权限控制方案时,需要综合考虑项目规模、开发周期、开发者熟悉度以及用户需求等因素。
【五】基于django的auth+admin+第三方美化 快速开发
【1】安装
- 通过使用pip命令安装
django-simpleui
库,运行以下命令进行安装:
pip3 install django-simpleui
【2】配置文件配置,注册app
- 在项目的配置文件中,需要将
simpleui
添加到INSTALLED_APPS
列表中。 - 打开项目的
settings.py
文件,在INSTALLED_APPS
设置项中添加'simpleui'
- 如下所示:
INSTALLED_APPS = [
'simpleui',
...
]
【3】菜单栏定制:
django-simpleui
支持自定义菜单栏。- 在
settings.py
文件中可以设置SIMPLEUI_CONFIG
来进行菜单栏的定制。 - 可以配置菜单的名称、图标、排序、链接等。
- 具体配置方法可以参考
django-simpleui
的官方文档。
【4】自定义菜单和页面:
- 通过在
SIMPLEUI_CONFIG
中配置自定义菜单和页面,可以实现对管理后台的更多个性化定制。 - 可以为不同的用户角色设置不同的菜单和页面展示。
【5】自定义按钮:
django-simpleui
还支持自定义按钮,可以在页面上添加自定义按钮来扩展管理后台的功能。- 可以通过配置
SIMPLEUI_CONFIG
来添加自定义按钮,自定义按钮的配置方式详见官方文档。
【6】切换图标:
- 在
settings.py
文件中,可以通过设置SIMPLEUI_ICON
来更改管理后台菜单栏的默认图标。 - 可以选择使用
Font Awesome
等图标库的图标,也可以使用自定义图标。
【7】首页显示的隐藏:
django-simpleui
还提供了配置首页显示或隐藏的选项。- 可以在
settings.py
文件中设置SIMPLEUI_HOME_INFO
,将其设置为False
来隐藏首页上的一些信息展示。
本文来自博客园,作者:Chimengmeng,转载请注明原文链接:https://www.cnblogs.com/dream-ze/p/17596111.html