权限控制(ACL、RBAC)、admin后台管理
一、ACL 访问控制列表
1、ACL(访问控制列表)的权限控制:(针对互联网用户的产品)
用户表 id name password 1 zhangsan 123 权限表 id user_id 权限 1 1 评论权限 2 1 发抖音权限 张三:[评论权限, 发抖音权限]
二、基于角色的访问控制
RBAC(Role-Based Access Control)基于角色的访问控制:(针对于公司内部项目)
权限与角色相关联,用户通过成为适当角色的成员而得到这些角色的权限。这就极大地简化了权限的管理。这样管理都是层级相互依赖的,权限赋予给角色,而把角色又赋予用户,这样的权限设计很清楚,管理起来很方便。
1、django中的auth rbac应用
# django的auth其实就实现了基于角色的访问控制---> 通过表控制的 -auth_user :用户表,存用户信息 -auth_group:组,角色,存放角色信息 -auth_permission:权限,存放权限信息 # 分析:一个组(角色)中,有多个用户,一个用户,属于多种角色----> 多对多 -auth_user_groups:用户和组的多对多中间表 # 分析:一个组,可能有多个权限,一个权限,也可能属于多个组---> 多对多 -auth_group_permissions:组和权限的多对多中间件 # django,多了张表:auth_user_user_permissions # 分析:一个用户,可以有多个权限,一个权限,可以分配个多个用户---> 多对多 -auth_user_user_permissions:用户和权限多对多中间表
2、补充
ABAC 基于属性的访问控制(Attribute-Based Access Control)
ABAC(Attribute-Based Access Control,基于属性的访问控制),又称为PBAC(Policy-Based Access Control,基于策略的访问控制),CBAC(Claims-Based Access Control,基于声明的访问控制)。 传统的ACL、RBAC的架构是{subject,action,object}, 而ABAC的架构是{subject,action,object,contextual}且为他们添加了parameter(参数)。 subject属性:比如用户的年龄、部门、角色、威望、积分等主题属性。 action属性:比如查看、读取、编辑、删除等行为属性。 object属性:比如银行账户、文章、评论等对象或资源属性。 contextual属性:比如时段、IP位置、天气等环境属性
三、django中权限控制
1、
# 公司内部,做公司内的项目需要使用这套权限控制
# 方案一:使用django-admin写 # 有的公司,不怎么写前端,直接使用django的admin,快速写出一套具有权限管理的系统 # django admin的界面不好看:第三方美化--》simpleui ## 方案二:自己写,前端使用vue,后端使用django,做公司内部的项目 -第三方开源的权限控制 项目 -python界:django-vue-admin -java界:若依 -go界:gin-vue-admin
2、安装
pip3 install django-simpleui INSTALLED_APPS = [ 'simpleui', # 放到最上面 ... ]
四、admin 后台管理model
1、注册
admin.site.register()
from django.contrib import admin # Register your models here. from .models import User, Book from .models import AuthUser from django.contrib.auth.models import Permission admin.site.register(User) admin.site.register(Book) admin.site.register(AuthUser) admin.site.register(Permission)
2、model
verbose_name_plural 字段能够修改表名显示
class User(models.Model): username = models.CharField(max_length=32) password = models.CharField(max_length=32) email = models.EmailField(max_length=12, null=True) gender = models.IntegerField(choices=((1, '男'), (2, '女'), (0, '未知')), null=True) def __str__(self): return self.username class Meta: verbose_name_plural = '自定义用户表'