【分享】一个JFinal自身实现权限系统的建设思路(JFinal拦截器版)

分享一个jfinal权限系统常用思路: 

1、数据库里创建用户表 角色定义表 用户角色中间表 用来创建用户和给用户分配角色 

2、数据库里创建权限资源定义表 定义出系统内可访问资源有哪些 比如菜单 导航 模块 按钮 非可视化权限等 

3、为角色分配这些权限资源 这样只要有这个角色的用户 就有了这个角色绑定的权限 

4、用户登录需要拿到用户的userId和对应的roles 存到session里 这样只要用户登录 就知道他的谁 有哪些角色  

5、同时需要在cache中存放一个角色对应的权限定义列表 这样就能轻松从cache里知道 哪个觉得有哪些权限可以访问 

6、上拦截器 在访问的时候拦截到当前是哪个用户 找到session里他的roles列表 通过 roles列表去cache里拿到他的所有可访问权限 在跟现在拦截到的要访问的资源对比一下 

7、包含就能通过权限校验 不包含就是无权访问 

8、其他页面元素权限自定义标签实现之

9、API接口鉴权,针对小程序和app等终端调用,使用token方式


JBolt中的实现方式,除了这样的基础设置,后面要加入多级部门版权限控制。

点击图片查看原图大图


微信截图_20190918092230.png


另外,JBolt极速开发平台里相关权限设计,都实现了上述内容,这里有个教程介绍:

在课程的第二小节里讲了,有图有真相。

https://www.jianshu.com/p/c798dd3e445f


本站推荐:

【视频教程】基于JFinal-undertow的项目打包与部署(linux centos7)

【技术】快速git仓库派生项目后本地与原项目和派生项目如何同步Merge操作步骤

【技术】JFinal新版sql模板有两种Template的调用方式,你学会了吗?

【源码】Jsoup是最好的 Java HTML 解析器,没有之一


JBolt插件安装和使用

https://ke.qq.com/course/354301?taid=2870150550611965&tuin=363b45b8

JFinal-JBolt开发平台从入门到精通-系列教程

https://www.jianshu.com/p/a18b61aa298a

JBolt开发平台入门(13)-自动化组件 autocomplete

https://my.oschina.net/imhoodoo/blog/3102509

JBolt开发平台入门(14)-四种主从表管理操作方式

https://my.oschina.net/imhoodoo/blog/3104717

JBolt开发平台入门(15)- 上下结构主从表管理简单实现

https://my.oschina.net/imhoodoo/blog/3106285

JBolt开发平台入门(16)- 弹出Dialog显示指定区域的html内容

https://my.oschina.net/imhoodoo/blog/3109162

如有疑问,加入JFinal学院 qq群 362557641 交流  JFinal学院

jfinal学院群.png

JFinal学院公众号:jfinalxueyuan

jfinalxueyuanqrcode.jpg

评论区

快乐的蹦豆子

2018-09-28 18:40

没毛病

7cc

2018-10-15 13:12

club的是这样的吗???

梦行

2019-09-09 11:51

现在自己设计的权限管理就是这样设计的,不过没用到中间表,组织和角色的权限合并就是用户的最终权限

山东小木

2019-09-09 11:53

JFinal

2019-09-09 15:39

@山东小木 jfinal 俱乐部的角色、权限管理的设计是当前最简洁的,但功能却一点也不少

不仅如此,还引入了一键同步生成所有权限的功能,节省无数时间,减少出错可能

walking_

2019-09-09 16:36

现在很多政府类的项目,页面上前台后台没有分那么清晰我拿角色和菜单(以前后端分离为例,这里只说菜单的显示与不显示问题)的关系来说,如果是后台管理页面,我一个角色如果拥有某一个菜单(比如二级菜单,在左侧显示),我给这个角色配置上拥有的菜单的权限(JSON数据),然后前端页面拿到当前登录用户拥有的菜单权限,在二级菜单那个地方循环显示就行了;但是有些前台页面也需要配置一些按钮的显示或者不显示,我只能提前知道了可能有某一个按钮(比如删除按钮,这个按钮的显示位置也是没有规律性的),然后给这个按钮一个唯一的标识,比如数字1,然后提前把这个按钮做好,判断写好(用户拥不拥有1这个权限),有则显示这个按钮,没则不显示;感觉这种方法挺笨的,但是我好想没有更好的解决办法,也是很苦恼~

JFinal

2019-09-09 16:40

@walking_ 让界面中的每一个动作都对应后端的一个 action, 一一对应用统一管理起来,多看看 jfinal club 中的用法

walking_

2019-09-09 16:45

@JFinal 这个已经对应起来了,就是参考的club,某一个用户能不能调用某一个接口的关系完全可以掌控,虽然是SpringBoot+MyBatis的项目,也把一键同步Action的设计参考过去了~

JFinal

2019-09-09 17:14

@walking_ action 是最细粒度的存在,所以将所有动作的权限都与 action 建立起来以后问题都解决了

你前面提到的场景应该也可以在这个方案下去满足,你再多想想如何让其融入到当前的方案之下

山东小木

2019-09-09 18:19

@JFinal 我用到的权限 分为 可视菜单 可视化页面元素 非可视化权限 等 需要经过应对controller级别权限 或者多个controller共用一个逻辑虚拟权限

zhangchuang

2019-09-10 08:50

自定义注解 放在 action上,拦截器拦截 action的注解,一个注解编码 可以用于多个 action,一个 action 可以用多个注解编码。注解编码可以是 资源编码,也可是 角色编码,还 可以扩展多个编码 的 and 、 or 关系。

没牙的小朋友

2019-09-13 08:32

@walking_ 粒度到前端的按钮确实不好做,可以仿照shiro在模板里用一些自定义指令判断是不是拥有某项功能权限。我觉得权限到功能应该是足够了,角色拥有多个权限,用户拥有多个角色

山东小木

2019-09-13 10:06

@没牙的小朋友 这些jbolt里都实现了

walking_

2019-09-16 17:30

@没牙的小朋友 是前后端分离的项目 前端用的vue 权限相关信息都是后台返回的JSON规范的数据,没办法像模板引擎一样定义指令,页面在后台渲染;再一个就是,有些需求就是页面的按钮,如果某个用户没有相应操作,就不让其看到那个按钮,而不是点击完之后提示其没有相应权限~

山东小木

2019-09-16 18:33

@walking_ 后端渲染在后端模板里处理 有后端模板指令
同样前端vue有前端的模板 可以在前端调用鉴权接口处理权限问题 如果是后台管理类应用 用了前后分离开发 鉴权同理 如果是小程序中需要根据用户权限控制UI 要么动态加载可访问权限列表 js里判断处理 要么就是 异步鉴权通讯 怎么都能实现

walking_

2019-09-17 11:26

@山东小木 现在就是比如登录成功之后直接就返回一级菜单的信息,点击某一个一级菜单然后调用一个接口获取该菜单下有哪些二级菜单或者按钮这样做的,这些菜单和按钮是在数据库配置的和角色绑定,用户拥有这些角色就拥有这些菜单或者按钮的显示权限;基本上就是这个思路,不好的地方或者说是不方便的地方就是如果页面结构不固定,比如某个菜单下的按钮,在页面的布局上哪里都有可能的情况下,这些必须是预先知道的,然后前端提前把这个按钮做好这样,然后数据库再添加这个按钮的信息;

山东小木

2019-09-18 09:15

@walking_ jbolt灵活设计为可视元素和逻辑权限 一部分用于菜单处理 剩下的可以处理任何可视元素和逻辑权限

山东小木

2019-09-18 09:26

@walking_ 点击看大图 微信截图_20190918092230.png

walking_

2019-09-18 11:02

@山东小木 好久没pull JBolt的代码了 抽空好好研究下