用户权限
一个商城,后台维护人员不只一个,还有其他后台人员,如:信息录入、财务、运营、采购等,他们对应的角色不同,所对应的权限也不相同,需要后台管理员来分配权限。
1. RBAC介绍
RBAC概述
在网站中,用户通过URL地址,进入网站的后端逻辑,从而对网站的数据库进行操作管理。可以让拥有权限的用户来完成操作,而没有权限的用户无法操作.
RBAC
是基于角色的访问控制(Role-Based Access Control
),在RBAC
中,权限与角色相关联,用户通过成为适当角色的成员而得到这些角色的权限,这就极大地简化了权限的管理。将权限赋予角色,而把角色又赋予用户,这样的权限设计很清楚,管理起来很方便
RBAC
认为授权实际上是Who
、What
、How
三元组之间的关系,也就是Who
对What
进行How
的操作,也就是“主体”对“客体”的操作。
Who:是权限的拥有者或主体(如:User,Role)。
What:是操作或对象(operation,object)。
How:具体的权限(Privilege,正向授权与负向授权)。
RBAC
生命周期
1、用户登陆验证
2、根据用户身份验证信息,获取用户的角色
3、通过用户所绑定的角色,获取这个角色绑定的所有权限,并去重
4、查询用户所访问的URL是否在角色的权限内,如果在,则继续访问,如果不在,拒绝访问
2. RBAC表设计
2.1 RBAC表设计
用户表
id | username | password | phone | last_login | role |
---|---|---|---|---|---|
1 | lucy123 | *** | 1733** | 2022-3-15 17:30:01 | 1 |
2 | jack123 | *** | 1733** | 2022-3-15 17:30:01 | 3 |
权限表
id | name | code_name | type_name |
---|---|---|---|
1 | 订单列表 | get ^orders/info/$ | 1 |
2 | 新增订单 | post ^orders/info/$ | 1 |
3 | 检索订单 | get ^orders/info/(?P<pk>[^/.]+)/$ | 1 |
4 | 更新订单 | put ^orders/info/(?P<pk>[^/.]+)/$ | 1 |
5 | 删除订单 | delete ^orders/info/(?P<pk>[^/.]+)/$ | 1 |
6 | 权限列表 | get ^users/permission/$ | 1 |
7 | 增加权限 | post ^users/permission/$ | 1 |
8 | 检索权限 | get ^users/permission/(?P<pk>[^/.]+)$ | 1 |
9 | 更新权限 | put ^users/permission/(?P<pk>[^/.]+)$ | 1 |
10 | 删除权限 | delete ^users/permission/(?P<pk>[^/.]+)$ | 1 |
权限类型
, 即角色
id | name |
---|---|
1 | 管理员 |
2 | 运营 |
3 | 新人 |
用户组
id | name | user | permission |
---|---|---|---|
1 | 开发组 | 1 | 1 |
2 | 开发组 | 1 | 2 |
3 | 开发组 | 1 | 3 |
4 | 开发组 | 1 | 4 |
5 | 开发组 | 1 | 5 |
6 | 开发组 | 2 | 1 |
7 | 开发组 | 2 | 3 |
模型类定义
from django.db import models
from django.contrib.auth.models import AbstractUser
# 权限类型(角色)
# name varchar(30) '权限类型的名称'
class PermissionType(models.Model):
"""权限的类型"""
name = models.CharField(max_length=30, verbose_name='权限类型的名称')
class Meta:
db_table = 'permission_type'
def __str__(self):
return self.name
# 用户模型类,继承AbstractUser
# phone, varchar(11) 允许空 唯一 '用户手机'
# last_login
# role fk--->PermissionType
class User(AbstractUser):
"""
用户表
"""
phone = models.CharField(max_length=11, null=True, unique=True, blank=True, verbose_name='用户手机')
last_login = models.DateTimeField()
# 已定义好的模型类,可添加字段
role = models.ManyToManyField(PermissionType, verbose_name='所属角色')
class Meta:
db_table = 'user'
def __str__(self):
return self.username
# 权限表
# name varchar(30) '权限名称'
# code_name varchar(300) '权限识别名称'
# type_name fk --->PermissionType
class Permission(models.Model):
"""
权限模型类
"""
name = models.CharField(max_length=30, verbose_name='权限名称')
code_name = models.CharField(max_length=300, verbose_name='权限识别名称')
type_name = models.ForeignKey(PermissionType, on_delete=models.CASCADE)
def __str__(self):
return self.name
class Meta:
db_table = 'permission'
# 用户组
# name varchar(30) '组名称'
# user m:n
# permission m:n
class UserGroup(models.Model):
"""用户组的模型类"""
name = models.CharField(max_length=30, verbose_name='组名称')
user = models.ManyToManyField(User)
# 更改模型类: 改为多对多
permission = models.ManyToManyField(Permission)
class Meta:
db_table = 'user_group'
def __str__(self):
return self.name
添加测试数据
- 根据以上表中的数据,在pycharm中添加权限类型。
- 添加管理权限数据的管理员权限
使用django>admin超级管理后台,添加数据:
# 创建超级用户
# python manage.py createsuperuser
# 权限模型类 注册到管理后台
class PermissionManager(admin.ModelAdmin):
# 显示哪些字段
list_display = ["id", "name", "code_nam