zoukankan      html  css  js  c++  java
  • 权限

    ######## 权限 ########
    
    #用户登录成功后 
    
    	1. setting 权限配置
    
    	2. 获取角色对应的所有权限
    		- permission_list = user.roles.values('permissions__id', 'permissions__caption', 'permissions__url','permissions__menu_id').distinct()
    
    	3. 获取权限列表
    		- permission_url_list = []
    	   获取挂靠在菜单上权限列表 
    	    - permission_menu_list = []	
    
    	4. 权限写入session
    
    	5. 菜单写入session
    		- 所有的菜单列表
    		- 挂靠在菜单上权限列表
    
    
    #中间件
    
    	import re
    	from django.conf import settings
    	from django.utils.deprecation import MiddlewareMixin
    	from django.shortcuts import HttpResponse
    	from django.utils.safestring import mark_safe
    
    
    	class RbacMiddleware(MiddlewareMixin):
    	    def process_request(self, request, *args, **kwargs):
    	        """
    	        检查用户是否具有权限访问当前URL
    	        :param request: 
    	        :param args: 
    	        :param kwargs: 
    	        :return: 
    	        """
    
    	        """跳过无需权限访问的URL"""
    	        for pattern in settings.RBAC_NO_AUTH_URL:
    	            if re.match(pattern, request.path_info):
    	                return None
    
    	        """获取当前用户session中的权限信息"""
    	        permission_url_list = request.session.get(settings.RBAC_PERMISSION_URL_SESSION_KEY)
    	        if not permission_url_list:
    	            return HttpResponse(settings.RBAC_PERMISSION_MSG)
    
    	        """当前URL和session中的权限进行匹配"""
    	        flag = False
    	        for url in permission_url_list:
    	            pattern = settings.RBAC_MATCH_PARTTERN.format(url)
    	            if re.match(pattern, request.path_info):
    	                flag = True
    	                break
    
    	        if not flag:
    	            if settings.DEBUG:
    	                return HttpResponse("无权访问,你的权限有:<br/>" + mark_safe("<br/>".join(permission_url_list)))
    	            else:
    	                return HttpResponse(settings.RBAC_PERMISSION_MSG)
    
    用户登录,通过用户找到角色,通过角色找到这个用户的所有权限(注意权限去重),会生成两种数据格式:
    	- 权限:
    		ret = {
    			用户组1:{
    				"code":["list","add","del","edit"],
    				"url":[
    					"/userinfo/",
    					"/userinfo/add/",
    					"/userinfo/del/(d+)/",
    					"/userinfo/edit/(d+)/",
    				]
    			},
    			用户组2:{
    
    			},
    		}
    
    	- 菜单:
    		- 循环权限列表,如果不是菜单,继续循环。
    		- 获取菜单id,菜单标题,权限名称,权限url,active=False
    		menu_list = [
    			{'menu_id':1, 'menu_title':'菜单一','title':'用户列表','url':'/userinfo/','active':False},
    			{'menu_id':1, 'menu_title':'菜单一','title':'订单列表','url':'/order/'.'active':False},
    			{'menu_id':2, 'menu_title':'菜单二','title':'xxx列表','url':'/xxx/','active':False},
    			{'menu_id':2, 'menu_title':'菜单二','title':'iii列表','url':'/uuu/','active':False},
    		]
    		- 循环数据结构:
    			- 如果当前url和循环匹配,设置active=True
    
    
    		ret = {
    			1: {
    				 'menu_id':1,
    				 'menu_title':'菜单一',
    				 'active':'True',
    				 'children': [
    					{'title':'用户列表','url':'/userinfo/','active':True},
    				 ]
    			},
    		}
    
    
    
    权限,首先运行中间件:
    	- 获取用户访问的url
    	- API白名单  循环配置文件的的白名单,和当前访问的url正则匹配,如果匹配成功,返回None,执行视图,不再执行中间件下的代码。
    	- 获取session中的权限,如果获取不到,证明没有登录,返回登录页面。
    	- 循环权限字典,判断当前url是否在ret[用户组]["url"]中
    		- 如果在,将code_list赋值给request,供前端控制 增加 编辑 删除
    		- 如果不在,返回无权限。
    
    
    
    菜单
    
    
    
    
    
    
    
    
    
    为什么会有用户组?
    
    	用户在根据当前url和session中的对比时,如果url匹配则获取code,供前端使用。
    	为了区分哪些url的各种code属于哪一类
    
    	用户组1:{
    		"code":["list","add","del","edit"],
    		"url":[
    			"/userinfo/",
    			"/userinfo/add/",
    			"/userinfo/del/(d+)/",
    			"/userinfo/edit/(d+)/",
    		]
    
    code的作用?
    	供前端显示增加,删除,编辑。
    
    
    
    为什么有菜单?
    	一个组下面的url的太少
    

      

      

  • 相关阅读:
    PHP里文件的查找方式及写法
    上传文件
    用ajax对数据进行查看人员信息
    ajax实现分页
    jquery做个日期选择适用于手机端
    PHP用ajia代码写三级联动下拉
    JSON数据的定义
    jquery做一些小的特效
    对jquery操作复选框
    使用 LUT 模拟光照
  • 原文地址:https://www.cnblogs.com/golangav/p/7568114.html
Copyright © 2011-2022 走看看