权限管理 RBAC
权限管理
1. 为什么要有权限?
2. 开发一套权限的组件。为什么要开发组件?
3. 权限是什么?
web 开发中 URL 约等于 权限
4. 表结构的设计
权限表
ID URL
1 /customer/list/
2 /customer/add/
用户表
ID name pwd
1 ward 123
用户和权限的关系表(多对多)
ID user_id permission_id
1 1 1
1 1 2
5. 写代码
1. 查询出用户的权限写入session
2. 读取权限信息,判断是否有权限
最初版的权限管理梳理流程
表结构
from django.db import models
class Permission(models.Model):
"""
权限表
"""
title = models.CharField(max_length=32, verbose_name='标题')
url = models.CharField(max_length=32, verbose_name='权限')
class Meta:
verbose_name_plural = '权限表'
verbose_name = '权限表'
def __str__(self):
return self.title
class Role(models.Model):
name = models.CharField(max_length=32, verbose_name='角色名称')
permissions = models.ManyToManyField(to='Permission', verbose_name='角色所拥有的权限', blank=True)
def __str__(self):
return self.name
class User(models.Model):
"""
用户表
"""
name = models.CharField(max_length=32, verbose_name='用户名')
password = models.CharField(max_length=32, verbose_name='密码')
roles = models.ManyToManyField(to='Role', verbose_name='用户所拥有的角色', blank=True)
def __str__(self):
return self.name
settings文件配置
# ###### 权限相关的配置 ######
PERMISSION_SESSION_KEY = 'permissions'
WHITE_URL_LIST = [
r'^/login/$',
r'^/logout/$',
r'^/reg/$',
r'^/admin/.*',
]其实权限就是用户能够访问那些url,不能访问那些url,我们所做的就是将每个不同身份的人
分配不同的url
在最初用户登录的时候就查询出用户的权限。并将此次权限存入到session中
为什么要存入session中啊,为了不重复读取数据库,存到session中
我们可以配置session然后将session存到缓存中(非关系型数据库中)
这样读取的速度回很快
登录成功后如何查看当前用户的权限并将其写入到session中
from django.shortcuts import render, HttpResponse, redirect, reverse
from rbac import models
from django.conf import settings
...
user = models.User.objects.filter(name=username, password=pwd).first()
# 登录成功
# 将权限信息写入到session
# 1. 查当前登录用户拥有的权限
permission_list = user.roles.filter(permissions__url__isnull=False).values_list(
'permissions__url').distinct()
# for i in permission_list:
# print(i)
# 2. 将权限信息写入到session # 这里的键值我们做了全局配置
request.session[settings.PERMISSION_SESSION_KEY] = list(permission_list)
# 得到的permission_list是一个QuerySet的元组对象,因为session的存储是有数据类型限制所以转换为列表(列表中套元组)然后,该用户能够访问那些,不能访问那些,这时,我们可以将这个逻辑写在中间件这里
from django.utils.deprecation import MiddlewareMixin
from django.conf import settings
from django.shortcuts import HttpResponse
import re
class PermissionMiddleware(MiddlewareMixin):
# 每一个请求来,都会走这个钩子函数
def process_request(self, request):
# 对权限进行校验
# 1. 当前访问的URL
current_url = request.path_info
# 白名单的判断我们这里将白名单设置在了settings中,往settings中加就ok
for i in settings.WHITE_URL_LIST:
if re.match(i, current_url):
return
# 2. 获取当前用户的所有权限信息
permission_list = request.session.get(settings.PERMISSION_SESSION_KEY)
# 3. 权限的校验
print(current_url) # Django的session做了转换将元组转换成为一个列表
for item in permission_list:
url = item[0]
if re.match("^{}$".format(url), current_url):
return
else:
return HttpResponse('没有权限')