当前位置:网站首页>用户的管理-限制
用户的管理-限制
2022-07-27 05:02:00 【pink_Pig___】
1.先定义模型类
from django.db import models
from django.contrib.auth.models import AbstractUser
from django.utils import timezone
# Create your models here.
# 权限类
class PermissionType(models.Model):
name = models.CharField('权限类型', max_length=30)
def __str__(self):
return self.name
class Meta:
db_table = 'permission_type'
# 用户
class User(AbstractUser):
mobile = models.CharField('手机号', max_length=11)
last_login = models.DateTimeField('上次登录时间', default=timezone.now)
# 加入角色
role = models.ManyToManyField(PermissionType)
class Meta:
verbose_name_plural = '用户'
db_table = 'user'
# 权限
class Permission(models.Model):
name = models.CharField('权限名称', max_length=30)
code_name = models.CharField('权限', max_length=100)
type_name = models.ForeignKey(PermissionType, on_delete=models.CASCADE, verbose_name='权限类行')
def __str__(self):
return self.name
class Meta:
verbose_name_plural = '限制'
db_table = 'permission'
# 用户组
class UserGroup(models.Model):
name = models.CharField('组名', max_length=30)
user = models.ManyToManyField(User)
permission = models.ManyToManyField(Permission)
def __str__(self):
return self.name
class Meta:
db_table = 'usergroup'
- 需要到配置里面配置
AUTH_USER_MODEL = 'users.User'
2. 在根目录下创建一个RBAC中间件

2. 去配置项里面注册中间件
MIDDLEWARE = [
'RBAC.rbac.MyRBAC',
]
- 中间件里面写入代码
from django.utils.deprecation import MiddlewareMixin
import redis, re, json
from django.http import JsonResponse
from rest_framework_jwt.utils import jwt_decode_handler
# 自定义 rbac中间件
class MyRBAC(MiddlewareMixin):
def __init__(self, handler):
super(MyRBAC, self).__init__(handler)
self.redis_conn = redis.Redis(host='127.0.0.1', port=6379)
# 在请求进入路由之前处理请求
def process_request(self, request):
path = request.path_info[1:] # 取掉第一个/
method = request.method.lower() # GET / POST
# 判断当前请求是否登录、获取短信验证码、admin管理
if re.findall('login|sms_code|^admin', path, re.I):
# 直接放过这些请求
return None
# 处理其他的获取资源的请求
# 验证用户是否登录, jwt token
payload = self.validate_token(request)
if payload:
# 用户已登录
print('用户的载荷信息:', payload)
# 验证当前请求是否有权限
key = 'user_permissions_%s' % payload.get('user_id')
permission_list = self.redis_conn.get(key)
if permission_list:
# 解码字节串---》 json字符串
# 解出json字符串---》 权限列表
permissions_list = json.loads(permission_list.decode())
# 遍历权限列表, 逐一对比,查看是否有权限
for permission in permissions_list:
if permission.startswith(method):
print(permission)
print(path)
re_path = permission.split()[1]
if re.findall(re_path, path, re.I):
# 具有权限, 让当前请求进入路由匹配
return None
return JsonResponse({
'code': 403, 'msg': '没有权限'})
else:
# 没有权限数据
return JsonResponse({
'code': 401, 'msg': '没有权限'})
else:
return JsonResponse({
'code': 401,
'msg': '用户未认证'
})
@staticmethod
def validate_token(request):
# 获取jwt token
token = request.headers.get("Authorization")
if not token:
return None
token = token.split()[1]
# 解码token
try:
payload = jwt_decode_handler(token)
return payload
except:
return None
- 修改登录接口
# 存储用户的权限
roles = user.role.all()
print('rolse:', roles)
temp_list = []
for role in roles:
# 根据每一个角色获取对应的权限
permissions = role.permission_set.all().values_list('code_name')
permissions_list = [i[0] for i in permissions]
temp_list += permissions_list
# 权限去重,并存入内存
temp_list = list(set(temp_list))
print('temp_list:', temp_list)
key = 'user_permissions_%s'%user.id
r = redis.Redis()
r.set(key, json.dumps(temp_list))
3. 在超级用户里面添加信息
- settings.py配置中文
LANGUAGE_CODE = 'zh-Hans'
TIME_ZONE = 'Asia/Shanghai'
- 注册超级用户
python manage.py createsuperuser
- 子应用admin文件里写入代码
from django.contrib import admin
from users.models import *
# Register your models here.
# 模型类的管理器
class PermissionManager(admin.ModelAdmin):
list_display = ['id', 'name', 'code_name', 'type_name']
list_display_links = ['name']
list_editable = ['code_name']
list_filter = ['type_name']
search_fields = ['name']
admin.site.register(Permission, PermissionManager)
权限类里面加入信息

添加一些权限

边栏推荐
- 268.missing number of leetcode
- Integrate SSM
- 如何快速上手强化学习?
- 6 zigzag conversion of leetcode
- Niuke sword refers to the path in the offer--jz12 matrix
- JVM Part 1: memory and garbage collection part 8 - runtime data area - Method area
- B1031 check ID card
- JVM Part 1: memory and garbage collection -- runtime data area 4 - program counter
- Laozi cloud and Fuxin Kunpeng achieved a major breakthrough in 3D ofd 3D format documents for the first time
- BIO、NIO、AIO区别
猜你喜欢

JVM Part 1: memory and garbage collection part 9 - runtime data area - object instantiation, memory layout and access location

pytorch 数据类型 和 numpy 数据 相互转化

Li Kou achieved the second largest result

MQ set expiration time, priority, dead letter queue, delay queue

接收方设置并发量和限流

数据库连接池&&Druid使用

String class

ERP system brand

How to store the startprocessinstancebykey method in acticiti in the variable table

弹球小游戏
随机推荐
numpy 数据类型转化
Localdatetime and zoneddatetime
What should test / development programmers over 35 do? Many objective factors
268.missing number of leetcode
MQ FAQ
Detailed explanation of pointer constant and constant pointer
辗转相除法
Critical path principle
B1024 scientific counting method
How to sinicize the JMeter interface?
Database design - relational data theory (ultra detailed)
数据库连接池&&Druid使用
JVM上篇:内存与垃圾回收篇十一--执行引擎
JVM Part 1: memory and garbage collection -- runtime data area 4 - program counter
Quoted popular explanation
DBUtils
Basic operation of vim
Three waiting methods of selenium and three processing methods of alert pop-up
Rolling Division
Notes series k8s orchestration MySQL container - stateful container creation process