权限组件—rbac
什么是权限?
对系统功能进行限制
权限与应用
权限可以应用于多个应用中
用户、角色、权限
不给用户直接分配权限,通过将用户分配角色,给角色分配权限
一个包含正则表达式的url相当于一个权限
用户登录成功后:
1.查询当前用户的所有权限
1.1查询用户的角色
ret = user.roles.all()
1.2查询角色对应的权限
ret = ret.values('permissions__url').distinct()
permission_list = []
for i in ret:
permission_list.append(i['permissions_url'])
2.将权限保存到缓存中
request.session['user_id'] = user.pk
request.session['permission_list'] = permission_list
用户访问url:
1.取当前用户权限:
permission_list = request.session['permission_list']
current_path = request.path_info
2.判断是否权限匹配
import re
flag = Flase
for permission in permission_list:
permission = '^%S$' % permission
ret = re.match(permission, current_path)
if ret:
flag = True
break
if not flag:
return HttpResponse("没有权限")
return None
每一个视图都需要进行权限判断,太臃肿,需要将权限判断的代码进行抽取、封装成一个中间件
中间件
本质:方便用户在访问视图的时候,判断用户时候拥有访问此视图的权限
实现逻辑:用户访问视图,系统在用户请求前,先判断此视图的路径是否在系统的白名单中,然后获取用户的所有权限,再将当前视图路径与用户权限进行匹配,以此达到测试用户是否能访问视图
class RbacMiddleware(MiddlewareMixin):
def process_request(self, request):
current_url = requst.path_info
for valid_url in valid_url_list:
if re.match(valid_url, current_url):
return None
user = request.session.get('user_id')
if not user:
return redirct('/login/')
permission_list = request.session.get('permission_list')
flag = Flase
for permission in permission_list:
permission = '^%s$' % permission
ret = re.match(permission, current_url)
if ret:
flag = True
break
if not flag:
return HttpResponse('没有权限')
return None
抽取用户登录函数中关于权限的代码
def init_permission(request, user):
ret = user.roles.all()
ret = ret.values('permissions__url').distinct()
permission_list = []
for i in ret:
permission_list.append(i['permissions_url'])
request.session['user_id'] = user.pk
request.session['permission_list'] = permission_list
总结
1. 创建表,三个表,迁移,都是多对多关系
1.1 用户表
1.2 角色表
1.3 权限表
2. 录入数据
3. 登录校验
if 登录成功:
将用户注册到缓存中
查询当前登录用户的权限注册到session中
4. 校验权限
4.1 创建中间件