模型
基础模型共有三个概念:
- 用户
- 角色
- 菜单
用户与角色是一对多的关系,角色与菜单是一对多的关系。
角色
角色是中间过渡层,某个登录的用户,通过用户唯一标识(判断用户承担哪些角色),判断具有哪些权限,进而确定其能执行哪些操作(访问哪些资源)
菜单
在administrator项目中,菜单共分为三类,如下:
- 目录(无页面指向,无权限依附)
- 菜单(有页面指向,无权限依附)
- 按钮(无页面指向,有权限依附)
按钮
按可见性分,按钮分为两类,一类是看的见的按钮,一类是看不见的按钮。
- 看的见的按钮,称之为功能性按钮,每一个功能性按钮都应该在权限系统中注册;
- 看不见的按钮在页面中不体现,但用于被权限依附。(特指【查看】按钮)。
模型实现
模型在项目中通过5张关系表来实现:
- 用户表sys_user(主键、用户名、密码(密)、盐)
- 角色表sys_role(主键、名称、备注)
- 用户角色关系表sys_user_role(主键、用户主键、角色主键)
- 菜单表sys_menu(主键、父键、名称、指向、权限、类型、图片、排序)
- 角色菜单关系表sys_role_menu(主键、角色主键、菜单主键)
职责分配
Shiro的职责是,对每一个操作请求(及资源访问请求),验证请求者是否具备对应的权限。“权限”这个概念在项目中的具体落地则是指唯一的字符串。由于项目庞大,权限较多,因此需要采用冒号分隔法来体现权限的层级结构。
为了排除一些不需要验证的的操作请求(及资源访问请求),Shiro提供了过滤器支持。具体如何配置及使用可参见官网。
对于Shiro的session管理、缓存管理等其他方面的知识,时常参考官网及imooc网站进行学习。
开发者的职责是:
- 负责向Shiro提供其需要的Realm。Realm存储了合法用户有哪些,权限定义了多少个,及用户与权限的对应关系(需通过角色层过渡)。
- 在定义一个接口时,需要定义对应的权限,这个权限最终要依附于“按钮”进行分配。这个按钮可以在界面上体现(可点击),也可以不在界面上体现(只用于管理员分配)
原则上讲,可点击按钮对应的接口权限必须依附于对应的按钮,而其他跨表接口的权限则可以统一写入页面对应的【查看】按钮不可见按钮中。(减少一个权限对应一个按钮的实际操作的复杂度)
总结
下面总结一下在实际开发过程中,对于权限分配的可操作步骤:
后端开发程序员(写接口时),在文档中应说明调用该接口应具备的权限(字符串)
前端开发程序员(写页面和js的),在界面中调用的每一个接口,都应判断该接口的调用是否需要权限。如果需要权限,则应通过后台管理系统将权限分配给对应的按钮上。(实体按钮)(虚拟按钮)
后记
当用户登录成功之后,页面会缓存该用户的所具备的权限列表(由服务器返回),页面根据权限的有无来确定菜单(包括目录、菜单、按钮)的显示与否。
Realm中存储的权限用于比对,即使前端页面通过非法手段在缓存的权限列表中增加了部分假权限,进而看到了被隐藏的按钮,但到服务端的时候依然验证不过。
网友评论