引子:
1.为什么需要权限?
由于用户的身份不同,我们需要根据他的角色来给其赋予不同的权限,以便更好分工且避免责任不明确的问题。
2.为什么要开发一个权限组件?
权限问题对于大多数系统都会用到,根据当前实际开发出一套比较完备的权限组件,当业务需要时根据具体业务适当修改,可大量节省开发时间,提高开发效率。
3.再WEB开发中什么是权限?
URL约等于权限,给某用户访问某URL的权限,就是给了他该url对应模块的使用权限。
权限设计的步骤
一 权限表的设计
1.权限表
2.角色表
3.用户表
二 具体权限逻辑的实现
1.写登录函数
1 from django.shortcuts import render, redirect 2 from rbac import models 3 from django.conf import settings 4 def login(request): 5 if request.method=='POST': 6 username=request.POST.get('user') 7 password=request.POST.get('pwd')
用户校验 8 user=models.UserInfo.objects.filter(name=username,password=password).first() 9 if not user: 10 return render(request,'login.html',{'err_msg':'用户名或密码错误'})
校验完成后写到session中
11 permission_list=user.roles.filter(permissions__url__isnull=False).values('permissions__url').distinct() 12 request.session[settings.PERMISSION_SESSION_KEY]=list(permission_list) ---->permission_list为一个QuerySet对象,无法进行JSON操作,故须先进行强制转化 13 request.session['user_info']={'id':user.id,'name':user.name} 14 return redirect('/customer/list/') 15 return render(request,"login.html")
2.对权限进行校验
写在中间件中 process_request
1 from django.utils.deprecation import MiddlewareMixin 2 from django.conf import settings 3 import re 4 from django.shortcuts import render, redirect,HttpResponse 5 class RbacPermissionMiddleware(MiddlewareMixin): 6 def process_request(self,request): 7 # 1.获取当前路径 8 current_url=request.path_info 9 for i in settings.VALID_URL_LIST: #白名单 里面的URL不需要做校验 10 if re.match(i,current_url): 11 return 12 # 2.获取当前用户的所有权限 13 permission_list=request.session.get(settings.PERMISSION_SESSION_KEY) 14 # 3.校验权限 15 flag=False 16 for item in permission_list: 17 reg=item['permissions__url'] 18 if re.match("^%s$"%reg,current_url): 19 flag=True 20 break 21 # 校验不通过,返回错误信息 22 if not flag: 23 return HttpResponse('无权访问')
注意:中间件在使用前一定要在settings中注册
VALID_URL_LIST= [
'^/login/$',
'^/reg/$',
'^/admin/.*$',
]