点击关注公众号:互联网架构师,后台回复 2T获取2TB学习资源!

上一篇:Alibaba开源内网高并发编程手册.pdf

前言

作为一名后台开发人员,权限这个名词应该算是特别熟悉的了。就算是java里的类也有 public、private 等“权限”之分。之前项目里一直使用shiro作为权限管理的框架。说实话,shiro的确挺强大的,但是它也有很多不好的地方。shiro默认的登录地址还是login.jsp,前后端分离模式使用shiro还要重写好多类;手机端存储用户信息、保持登录状态等等,对shiro来说也是一个难题。

在分布式项目里,比如电商项目,其实不太需要明确的权限划分,说白了,我认为没必要做太麻烦的权限管理,一切从简。何况shiro对于springCloud等各种分布式框架来说,简直就是“灾难”。每个子系统里都要写点shiro的东西,慢慢的,越来越恶心。zuul网关就在这里大显身手了,控制用户的登录,鉴定用户的权限等等。zuul网关控制用户登录,鉴权以后再详说。以上拙见。

然后最近我发现了另一个权限框架jcasbin,虽然网上还没有很多关于博客,但是我看了一会就可以使用了。

顺手贴上github地址:https://github.com/casbin/jcasbin

一、准备

基于springboot1.5.10,但是和springboot关系不太大,所以版本可以忽略,用你熟悉的springboot版本就行。

1、mavan仓库引入

<dependency><groupId>org.casbin</groupId><artifactId>jcasbin</artifactId><version>1.1.0</version>
</dependency>
<dependency><groupId>org.casbin</groupId><artifactId>jdbc-adapter</artifactId><version>1.1.0</version>
</dependency>

2、配置文件

jcasbin把用户的角色、权限信息(访问路径)放置在配置文件里,然后通过输入流读取配置文件。主要有两个配置文件:model.conf 和 policy.csv。简单的使用GitHub里都讲了,在此就不再赘述了。

其实也可以读取数据库的角色权限配置。所以我们可以把关于数据库的信息提取出来,可以进行动态设置。

@Configuration
@ConfigurationProperties(prefix = "org.jcasbin")
public class EnforcerConfigProperties {private String url;private String driverClassName;private String username;private String password;private String modelPath;public String getUrl() {return url;}public void setUrl(String url) {this.url = url;}public String getDriverClassName() {return driverClassName;}public void setDriverClassName(String driverClassName) {this.driverClassName = driverClassName;}public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}public String getModelPath() {return modelPath;}public void setModelPath(String modelPath) {this.modelPath = modelPath;}@Overridepublic String toString() {return "EnforcerConfigProperties [url=" + url + ", driverClassName=" + driverClassName + ", username="+ username + ", password=" + password + ", modelPath=" + modelPath + "]";}}

这样我们就可以在application.properties里进行相关配置了。model.conf是固定的文件,之间复制过来放在新建的和src同级的文件夹下即可。policy.csv的内容是可以从数据库读取的。

org.jcasbin.url=jdbc:mysql://localhost:3306/casbin?useSSL=false
org.jcasbin.driver-class-name=com.mysql.jdbc.Driver
org.jcasbin.username=root
org.jcasbin.password=root
org.jcasbin.model-path=conf/authz_model.conf

二、读取权限信息进行初始化

我们要对Enforcer这个类初始化,加载配置文件里的信息。所以我们写一个类实现InitializingBean,在容器加载的时候就初始化这个类,方便后续的使用。

@Component
public class EnforcerFactory implements InitializingBean {private static Enforcer enforcer;@Autowiredprivate EnforcerConfigProperties enforcerConfigProperties;private static EnforcerConfigProperties config;@Overridepublic void afterPropertiesSet() throws Exception {config = enforcerConfigProperties;//从数据库读取策略JDBCAdapter jdbcAdapter = new JDBCAdapter(config.getDriverClassName(),config.getUrl(),config.getUsername(),config.getPassword(), true);enforcer = new Enforcer(config.getModelPath(), jdbcAdapter);enforcer.loadPolicy();//Load the policy from DB.}/*** 添加权限* @param policy* @return*/public static boolean addPolicy(Policy policy){boolean addPolicy = enforcer.addPolicy(policy.getSub(),policy.getObj(),policy.getAct());enforcer.savePolicy();return addPolicy;}/*** 删除权限* @param policy* @return*/public static boolean removePolicy(Policy policy){boolean removePolicy = enforcer.removePolicy(policy.getSub(),policy.getObj(),policy.getAct());enforcer.savePolicy();return removePolicy;}public static Enforcer getEnforcer(){return enforcer;}}

在这个类里,我们注入写好的配置类,然后转为静态的,在afterPropertiesSet方法里实例化Enforcer并加载policy(策略,角色权限/url对应关系)。

同时又写了两个方法,用来添加和删除policy,Policy是自定的一个类,对官方使用的集合/数组进行了封装。

public class Policy {/**想要访问资源的用户 或者角色*/private String sub;/**将要访问的资源,可以使用  * 作为通配符,例如/user/* */private String obj;/**用户对资源执行的操作。HTTP方法,GET、POST、PUT、DELETE等,可以使用 * 作为通配符*/private String act;public Policy() {super();}/*** * @param sub 想要访问资源的用户 或者角色* @param obj 将要访问的资源,可以使用  * 作为通配符,例如/user/** @param act 用户对资源执行的操作。HTTP方法,GET、POST、PUT、DELETE等,可以使用 * 作为通配符*/public Policy(String sub, String obj, String act) {super();this.sub = sub;this.obj = obj;this.act = act;}public String getSub() {return sub;}public void setSub(String sub) {this.sub = sub;}public String getObj() {return obj;}public void setObj(String obj) {this.obj = obj;}public String getAct() {return act;}public void setAct(String act) {this.act = act;}@Overridepublic String toString() {return "Policy [sub=" + sub + ", obj=" + obj + ", act=" + act + "]";}}

三、使用

1、权限控制

jcasbin的权限控制非常简单,自定义一个过滤器,if判断就可以搞定,没错,就这么简单。

@WebFilter(urlPatterns = "/*" , filterName = "JCasbinAuthzFilter")
@Order(Ordered.HIGHEST_PRECEDENCE)//执行顺序,最高级别最先执行,int从小到大
public class JCasbinAuthzFilter implements Filter {private static final Logger log = LoggerFactory.getLogger(JCasbinAuthzFilter.class);private static Enforcer enforcer;@Overridepublic void init(FilterConfig filterConfig) throws ServletException {}@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain chain)throws IOException, ServletException {HttpServletRequest request = (HttpServletRequest) servletRequest;HttpServletResponse response = (HttpServletResponse) servletResponse;String user = request.getParameter("username");String path = request.getRequestURI();String method = request.getMethod();enforcer = EnforcerFactory.getEnforcer();if (path.contains("anon")) {chain.doFilter(request, response);}else if (enforcer.enforce(user, path, method)) {chain.doFilter(request, response);} else {log.info("无权访问");Map<String, Object> result = new HashMap<String, Object>();result.put("code", 1001);result.put("msg", "用户权限不足");result.put("data",null);response.setCharacterEncoding("UTF-8");response.setContentType("application/json");response.getWriter().write(JSONObject.toJSONString(result,SerializerFeature.WriteMapNullValue));}}@Overridepublic void destroy() {}}

主要是用enforcer.enforce(user, path, method)这个方法对用户、访问资源、方式进行匹配。这里的逻辑可以根据自己的业务来实现。在这个过滤器之前还可以添加一个判断用户是否登录的过滤器。

2、添加删除权限

对于权限的操作,直接调用上面写好的EnforcerFactory里对应的方法即可。并且,可以达到同步的效果。就是不用重启服务器或者其他任何操作,添加或删除用户权限后,用户对应的访问就会收到影响。

@PutMapping("/anon/role/per")public ResultBO<Object> addPer(){EnforcerFactory.addPolicy(new Policy("alice", "/user/list", "*"));return ResultTool.success();}@DeleteMapping("/anon/role/per")public ResultBO<Object> deletePer(){EnforcerFactory.removePolicy(new Policy("alice", "/user/list", "*"));return ResultTool.success();}

写在后面的话

其实可以把jcasbin和SpringCloud的zuul结合来实现用户的统一登录和权限控制。自定义一个过滤器继承ZuulFilter即可,其他地方基本没啥区别。

来源:blog.csdn.net/WayneLee0809/article/details/85702551

End-

最后,关注公众号互联网架构师,在后台回复:2T,可以获取我整理的 Java 系列面试题和答案,非常齐全。

正文结束

推荐阅读 ↓↓↓

1.求求你别在用SpringMVC了,太Low了!Spring又官宣了一个更牛逼的替代框架!

2.从零开始搭建创业公司后台技术栈

3.程序员一般可以从什么平台接私活?

4.Spring Boot+Redis+拦截器+自定义Annotation实现接口自动幂等

5.为什么国内 996 干不过国外的 955呢?

6.中国的铁路订票系统在世界上属于什么水平?

7.15张图看懂瞎忙和高效的区别!

一款轻量级的权限框架,轻松搞定项目权限相关推荐

  1. 【2022 CCF BDCI 文心大模型创意项目】中秋款文心带你轻松搞定MV制作

    [2022 CCF BDCI 文心大模型创意项目]中秋款文心带你轻松搞定MV制作 项目效果先知 项目地址: https://aistudio.baidu.com/aistudio/projectdet ...

  2. 轻松搞定项目中的空指针异常Caused by: java.lang.NullPointerException: null

    轻松搞定项目中的空指针异常Caused by: java.lang.NullPointerException: null 参考文章: (1)轻松搞定项目中的空指针异常Caused by: java.l ...

  3. 一键加速去不掉加锁的_老旧油渍去不掉?这几款清洁神器帮你轻松搞定油污难题...

    生活中,我们常常被油污困扰,经常因为一点点的油污毁掉本来非常完美的一身衣服,让开心的外出变成烦躁和不快.那么面对该死的"油污"我们真的束手无策了吗?"NO",有 ...

  4. 一篇文章轻松搞定SpringSecurity权限框架!

    目录 前言 一.引入依赖 二.提供正常的业务接口 三.自定义用户认证 3.1 编写配置类 3.2 编写UserDetailsService实现类 3.3 启动项目,完成认证功能的验证 3.4 小说明 ...

  5. 分布式事务最终一致性-CAP框架轻松搞定

    前言 对于分布式事务,常用的解决方案根据一致性的程度可以进行如下划分: 强一致性(2PC.3PC):数据库层面的实现,通过锁定资源,牺牲可用性,保证数据的强一致性,效率相对比较低. 弱一致性(TCC) ...

  6. 开学季,这款学校收费管理软件轻松搞定收费、缴费问题!

    伴随着开学季,一年一度缴纳学费的时候又到了.每到开学季,学校和家长就开始犯愁. 学校:收费是个大工程,头疼! 家长:排队缴费时间长,头疼! 传统的收费模式,让财务老师的收费工作压力山大,让学生.家长缴 ...

  7. mybatis-plus团队新作:mybatis-mate 轻松搞定数据权限

    欢迎关注方志朋的博客,回复"666"获面试宝典 今天介绍一个 MyBatis - Plus 官方发布的神器:mybatis-mate 为 mp 企业级模块,支持分库分表,数据审计. ...

  8. 空指针在java中的环境配置,轻松搞定项目中的空指针异常Caused by: java.lang.NullPointerException: null...

    大家在项目测试过程中,是不是经常会碰到这个空指针异常呢Caused by: java.lang.NullPointerException: null 当大家遇到这个问题,大家是怎么处理?自己解决还是让 ...

  9. 【Jmeter篇】1小时轻松搞定项目接口自动化测试与数据驱动

    之前我们的用例数据都是配置在 Jmeter Http 请求中,每次需要增加,修改用例都需要打开 jmeter 重新编辑,当用例越来越多的时候,用例维护起来就越来越麻烦,有没有好的方法来解决这种情况呢? ...

  10. 线程导入大数据入库_大数据处理及分析该怎么做?用这款数据分析软件轻松搞定...

    ​对大数据的重视让很多企业都在纷纷寻找更好的大数据处理及分析方法?这款数据分析软件轻松搞定! 一.数据采集 虽然每天互联网都会产生大量的数据,对于企业来讲,要搜集对自己企业有用的数据才是真的大数据.首 ...

最新文章

  1. Linux--VI命令大全
  2. 【算法】K-Means聚类算法(k-平均或k-均值)
  3. mac远程redis_Linux:使用Mac远程(局域网内)访问Ubuntu主机上的Redis服务
  4. 学习Python要多久 要如何学习
  5. 屏幕分析师确认两款iPhone 13将采用LTPO屏幕 支持120Hz刷新率
  6. web前端基础(11html5和css)
  7. war包启动命令_【漏洞预警】Oracle WebLogic远程命令执行0day漏洞(CVE20192725补丁绕过)...
  8. 博为峰Java技术文章 ——JavaSE Swing JInternalFrame内部窗体面板II
  9. MapGis:mapgis设置中配置好系统库后仍报错不能打开子图库等错误
  10. 2022-2028全球与中国以太网控制器市场现状及未来发展趋势
  11. 2017年深度学习语义分割导读
  12. MonthCalendar显示该年的12个月份
  13. Win2003域之组策略应用
  14. 中国大学mooc慕课python答案_中国大学MOOC(慕课)Python编程基础答案
  15. 对数几率回归(逻辑回归)
  16. 阿里面试——机器学习/算法面试经验案例集合
  17. Dreamweaver CS4 快捷键大全
  18. 洛谷P2455 [SDOI2006]线性方程组
  19. 计算机核心论文投稿的一点碎碎念
  20. mac怎么强制退出程序,强制退出Mac程序,mac 强制退出程序

热门文章

  1. vue单文件组件中引用其他组件
  2. iphone开蓝牙wifi上网慢_iPhone连接wifi信号满格网速却慢?如何提速
  3. 移动硬盘在电脑上显示为本地磁盘并且出现打不开的情况
  4. Unity游戏开发中大数值显示问题
  5. java 检测ip网速_网站节点测速,网站节点测速,测试网站的真实打开时间
  6. 加了尾注怎么添加新页_wps添加有尾注,随后删掉之后空白页怎么也不删掉?求大神帮忙...
  7. PCI 卫星影像处理流程(PCI+Inpho+Global Mapper+PS)
  8. 遥感数据处理计算机硬件要求
  9. 博途V16 更改PLC的型号和固件版本
  10. 洛谷 P5713 【深基3.例5】洛谷团队系统 C语言