权限表设计:
基于角色的权限控制
用户表
id name 角色表
id title 用户角色关系表
id name_id title_id 权限表
id url 角色权限关系表
id title_id url_id
使用自定义rbac权限组件
拷贝rbac组件
清空migration目录
在setting注册rbac
'rbac', #django 2.0以上
数据库迁移录入信息
创建超级管理,添加权限信息(组件admin.py已经定制化)
用户登录后做权限和菜单的初始化
init_permission
from web import models from rbac import models #调用自定义权限和菜单组件 from rbac.service.init_permission import init_permission def login(request): ''' 登录代码,成功后调用init_permission传入request、登录用户信息(obj) ''' if request.method == 'GET': return render(request,'login.html') name=request.POST.get('name') pwd=request.POST.get('pwd') obj = models.UserInfo.objects.filter(name=name,password=pwd).first() if not obj: return render(request,'login.html',{'msg':'用户名密码错误'}) request.session['user_info'] = {'id':obj.id,'name':obj.name} init_permission(request,obj) return redirect('/customer/list/')
应用中间件,进行权限校验
'rbac.middleware.rbac.RbacMiddleware'
设置setting配置文件
#############权限相关####################### PERMISSION_SESSION_KEY = 'permissions_list' MENU_SESSION_KEY = 'menu_list' #白名单 VALID_URL = [ '^/login/$', '^/admin/.*', ]
显示动态菜单(引入静态文件)、在菜单栏
+{% menu request %}
、最上方导入{% load rbac %}
粒度控制到按钮
#加在需要控制的按钮上 {% if request|has_permission:'add' %} <a href="{% url 'add' %}">增加</a> {% endif %}
阶段问题
- 权限几张表?5张 (用户,角色,权限,用户角色,权限角色)
- 简述权限流程
- 粒度控制到了按钮级别的权限控制
- 用户登录成功,获取权限信息,存入session,
- 每次请求在中间件中做权限校验,中间件中获取用户请求的url,以及当前用户所拥有的所有权限,然后进行比较,
- 使用inclusion_tag实现动态菜单
- 为什么要把权限存入session
- 静态文件和模块文件
- 相关技术点
- orm查询 –去空,–去重
- 中间件 (用户登录白名单,权限验证)
- inclusion_tag(自定义页面的一块内容,用的时候只需要调用)
阶段问题总结(面试常问)
- 简述权限流程有
- 粒度控制到了按钮级别的权限控制
- 用户登录成功,获取权限信息,存入session,
- 每次请求,在中间件中做权限校验,
- 使用inclusion_tag实现动态菜单
- 如何实现控制到按钮的
- 用户登录时,用户所拥有的权限,别名==django路由的name构造成了一个字典;(字典快)
- 在页面中写了一个django模板的filter来进行判断是否显示
- 为什么要使用中间件
- 所有请求在达到视图函数之前,必须经过中间件,所有在中间件中对请求做处理比较简单
- 模板中的特殊方法:inclusion_tag、simpletag、filter
- 权限中使用了几张表
- 六张 用户、角色、用户角色、权限、角色权限、菜单
- 表中的字段(背表)
- 写流程(思维导图)
特殊字典的构造
权限 = { 权限别名: {"id":'',"title":'','url':'','pid':''}, {"id":'',"title":'','url':'','pid':''}, {"id":'',"title":'','url':'','pid':''}, }
菜单 = { 菜单ID:{ title:'', icon:'', children:[ {id:'1', ...} ] } }