权限应用
到目前为止,业务逻辑已经开发完毕了,接下来,需要与权限组件rbac进行整合!!
# 基本权限校验
咦?! 按照前面写的RBAC组件的使用文档一步步的来.. 大体上是对的!!
Step1: 将rbac组件拷贝项目, 并进行app注册
Step2: 将rbac组件中 的数据库迁移记录 全部删除.
Step3: 进行业务系统中用户表结构的设计. 遵循: 业务表结构中的用户表需要和rbac中的用户有继承关系
上述1,2,3步 在业务系统中的开发过程中就已经实现了. So,此时不用进行这三步诺.
# ======= 在这一系列的配置过程中,可能会报错html中通过{% url name %}反向生成url不成功,把name改对就好啦!这个不难滴.
■ settings.py中配置
RBAC_USER_MODLE_CLASS = "apps.web.models.UserInfo" # 业务系统中的用户表
# !这里需要注意的是,我们使用的是业务系统中自己写的那一套登陆、登出、首页,没有用rbac组件里已经写好了的.
# So,我们需要将rabc组件中 登陆、登出、首页相关的路由配置注释掉即可!!
# 批量操作权限时,自动化发现路由中URL时,排除的URL
AUTO_DISCOVER_EXCLUDE = [
'/admin/.*',
'/login/',
'/logout/',
'/index/',
]
■ 此时,rbac里的layout.html和stark里的layout.html关于侧边栏菜单以及面包屑导航的代码是注释掉的!!
★进行权限信息的录入
- http://127.0.0.1:8000/rbac/menu/list/
添加一级菜单: 客户管理、学员管理、权限管理、基本业务管理
添加二级菜单和非菜单权限,一个个的添加very very麻烦了!! 所以我们进行批量添加!
- http://127.0.0.1:8000/rbac/menu/mutil/permissions/
- 先在第一个面板 > 待新建权限列表 中将 自动发现的路由的名称都给写上!! 然后面板右上角的保存.
Hhhh,该案例中63个路由,你都要写名称,避免不了的,只是你只会写这一次,后续就不用了,一劳永逸~
- 因为在第一个面板中保存了,在第三个面板 > 待更新的权限列表中 对这一系列的路由进行菜单层级的分配!!
1> 首先,我们要找到可成为二级菜单的路由,把它分配给上面添加的一级菜单.
记得点击面板右上角的保存,这样的话,这些路由就成为了二级菜单啦!!
2> 接着,我们对剩下的非菜单权限配置它们所属的二级菜单!
☆ 特别注意,需要根据业务逻辑来,记得点击面板右上角的保存!!
举个例子:上课记录的列表页面是通过班级列表页面里的表格进行跳转过去的!
So,上课记录的CURD所属二级菜单应该就是班级列表!!
3> 最后,你再次访问http://127.0.0.1:8000/rbac/menu/list/?mid=4&sid=26
就可以点点点看看效果啦!!
■ - http://127.0.0.1:8000/rbac/role/list/
添加角色: 销售总监、销售、教质总监、班主任、CEO、任课教师
- http://127.0.0.1:8000/stark/web/userinfo/list/ (不同的业务系统,该url可能会不同.视情况而定)
添加用户,在进行业务系统开发的过程中,已经添加了些许用户,此步骤已完成.
■ 开始给角色分配权限、给用户分配角色!!
http://127.0.0.1:8000/rbac/distribute/list/
注意噢!页面上的勾选"角色列表"之类的,意思是具备 查看角色列表 的意思!!
■ 在业务系统的登陆逻辑中添加以下代码
# -- must do it: 在用户登录成功后,执行该语句!!
from apps.rbac.utils.initialize import init_permission
init_permission(current_user, request) # 用户权限信息的初始化
■ settings.py中配置
PERMISSION_SESSION_KEY = "permission_url_list_key" # 权限在Session中存储的key
MENU_SESSION_KEY = "menu_list_key" # 菜单在Session中存储的key
# 中间件中配置
MIDDLEWARE = [
# ... ... ...
'apps.rbac.utils.verify.RbacMiddleware',
]
# 白名单,无需登陆即可访问
VALID_URL_LIST = [
'/login/',
'/admin/.*',
'/favicon.ico',
]
# 需要登录但无需权限的URL / 登陆后的每个人都默认拥有的权限 / 登陆后不用做权限校验的路由
NO_PERMISSION_LIST = [
'/index/',
'/logout/',
]
■ rbac里的layout.html和stark里的layout.html 都需要进行下面的操作!
1> {% load side_menu %}
{% load breadcrumb %}
2> 侧边栏菜单以及面包屑导航的代码把注释取消掉!
注意噢!! 一般情况下,业务系统的html继承的是stark组件里的layout.html;rbac组件里的继承的是rbac组件里的layout.html
html页面继承时使用的哪个,你得通过 app注册顺序、以及路径(eg:{% extends 'rbac/layout.html' %})来思考判断!!
至于粒度控制到按钮,与前面写的文档些许有点不同,下一小节会详细阐述会怎么实现!!
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
接下来就是见证奇迹的时刻!!
用户只会在侧边栏中显示自己所拥有的权限对应的那些菜单!!
下方的截图登陆的用户的角色CEO,拥有所有的权限,所以它的侧边菜单是全的!
1>
2>
3>
# 粒度控制到按钮
新增、编辑、删除 没有对应的权限, 那么对应的按钮在页面上都不应该显示!!
前面写的rbac组件使用文档中对于粒度控制到按钮,需要在每个按钮中进行判断,很麻烦很麻烦.
下面是一个示例!! (要想实现粒度到按钮的控制,我们自定义的每个handler都需要继承PermissionHandler!!
粒度控制到表格的列.. 略.