Django项目的权限问题

引子:

  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/.*$',
]
原文地址:https://www.cnblogs.com/wdbgqq/p/9759583.html