0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

再见了shiro

jf_ro2CN3Fa ? 来源:CSDN ? 2023-01-15 11:32 ? 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群


前言

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

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

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

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

基于 Spring Boot + MyBatis Plus + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能

  • 项目地址:https://github.com/YunaiV/ruoyi-vue-pro
  • 视频教程:https://doc.iocoder.cn/video/

一、准备

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

1、mavan仓库引入


org.casbin
jcasbin
1.1.0


org.casbin
jdbc-adapter
1.1.0

2、配置文件

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

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

@Configuration
@ConfigurationProperties(prefix="org.jcasbin")
publicclassEnforcerConfigProperties{

privateStringurl;

privateStringdriverClassName;

privateStringusername;

privateStringpassword;

privateStringmodelPath;

publicStringgetUrl(){
returnurl;
}

publicvoidsetUrl(Stringurl){
this.url=url;
}

publicStringgetDriverClassName(){
returndriverClassName;
}

publicvoidsetDriverClassName(StringdriverClassName){
this.driverClassName=driverClassName;
}

publicStringgetUsername(){
returnusername;
}

publicvoidsetUsername(Stringusername){
this.username=username;
}

publicStringgetPassword(){
returnpassword;
}

publicvoidsetPassword(Stringpassword){
this.password=password;
}

publicStringgetModelPath(){
returnmodelPath;
}

publicvoidsetModelPath(StringmodelPath){
this.modelPath=modelPath;
}

@Override
publicStringtoString(){
return"EnforcerConfigProperties[url="+url+",driverClassName="+driverClassName+",username="
+username+",password="+password+",modelPath="+modelPath+"]";
}

}

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

org.jcasbin.url=jdbc//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

基于 Spring Cloud Alibaba + Gateway + Nacos + RocketMQ + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能

  • 项目地址:https://github.com/YunaiV/yudao-cloud
  • 视频教程:https://doc.iocoder.cn/video/

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

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

@Component
publicclassEnforcerFactoryimplementsInitializingBean{

privatestaticEnforcerenforcer;

@Autowired
privateEnforcerConfigPropertiesenforcerConfigProperties;
privatestaticEnforcerConfigPropertiesconfig;

@Override
publicvoidafterPropertiesSet()throwsException{
config=enforcerConfigProperties;
//从数据库读取策略
JDBCAdapterjdbcAdapter=newJDBCAdapter(config.getDriverClassName(),config.getUrl(),config.getUsername(),
config.getPassword(),true);
enforcer=newEnforcer(config.getModelPath(),jdbcAdapter);
enforcer.loadPolicy();//LoadthepolicyfromDB.
}

/**
*添加权限
*@parampolicy
*@return
*/
publicstaticbooleanaddPolicy(Policypolicy){
booleanaddPolicy=enforcer.addPolicy(policy.getSub(),policy.getObj(),policy.getAct());
enforcer.savePolicy();

returnaddPolicy;
}

/**
*删除权限
*@parampolicy
*@return
*/
publicstaticbooleanremovePolicy(Policypolicy){
booleanremovePolicy=enforcer.removePolicy(policy.getSub(),policy.getObj(),policy.getAct());
enforcer.savePolicy();

returnremovePolicy;
}

publicstaticEnforcergetEnforcer(){
returnenforcer;
}


}

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

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

publicclassPolicy{
/**想要访问资源的用户或者角色*/
privateStringsub;

/**将要访问的资源,可以使用*作为通配符,例如/user/**/
privateStringobj;

/**用户对资源执行的操作。HTTP方法,GET、POST、PUT、DELETE等,可以使用*作为通配符*/
privateStringact;

publicPolicy(){
super();
}

/**
*
*@paramsub想要访问资源的用户或者角色
*@paramobj将要访问的资源,可以使用*作为通配符,例如/user/*
*@paramact用户对资源执行的操作。HTTP方法,GET、POST、PUT、DELETE等,可以使用*作为通配符
*/
publicPolicy(Stringsub,Stringobj,Stringact){
super();
this.sub=sub;
this.obj=obj;
this.act=act;
}

publicStringgetSub(){
returnsub;
}

publicvoidsetSub(Stringsub){
this.sub=sub;
}

publicStringgetObj(){
returnobj;
}

publicvoidsetObj(Stringobj){
this.obj=obj;
}

publicStringgetAct(){
returnact;
}

publicvoidsetAct(Stringact){
this.act=act;
}

@Override
publicStringtoString(){
return"Policy[sub="+sub+",obj="+obj+",act="+act+"]";
}

}

三、使用

1、权限控制

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

@WebFilter(urlPatterns="/*",filterName="JCasbinAuthzFilter")
@Order(Ordered.HIGHEST_PRECEDENCE)//执行顺序,最高级别最先执行,int从小到大
publicclassJCasbinAuthzFilterimplementsFilter{

privatestaticfinalLoggerlog=LoggerFactory.getLogger(JCasbinAuthzFilter.class);

privatestaticEnforcerenforcer;

@Override
publicvoidinit(FilterConfigfilterConfig)throwsServletException{
}

@Override
publicvoiddoFilter(ServletRequestservletRequest,ServletResponseservletResponse,FilterChainchain)
throwsIOException,ServletException{
HttpServletRequestrequest=(HttpServletRequest)servletRequest;
HttpServletResponseresponse=(HttpServletResponse)servletResponse;

Stringuser=request.getParameter("username");
Stringpath=request.getRequestURI();
Stringmethod=request.getMethod();

enforcer=EnforcerFactory.getEnforcer();
if(path.contains("anon")){
chain.doFilter(request,response);
}elseif(enforcer.enforce(user,path,method)){
chain.doFilter(request,response);
}else{
log.info("无权访问");
Mapresult=newHashMap();
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));
}

}

@Override
publicvoiddestroy(){

}

}

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

2、添加删除权限

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

@PutMapping("/anon/role/per")
publicResultBOaddPer(){

EnforcerFactory.addPolicy(newPolicy("alice","/user/list","*"));

returnResultTool.success();
}

@DeleteMapping("/anon/role/per")
publicResultBOdeletePer(){

EnforcerFactory.removePolicy(newPolicy("alice","/user/list","*"));

returnResultTool.success();
}

		

写在后面的话

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

审核编辑 :李倩


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 框架
    +关注

    关注

    0

    文章

    404

    浏览量

    17986
  • spring
    +关注

    关注

    0

    文章

    341

    浏览量

    15220
  • 过滤器
    +关注

    关注

    1

    文章

    440

    浏览量

    20478

原文标题:再见了 shiro

文章出处:【微信号:芋道源码,微信公众号:芋道源码】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    广西壮族自治区领导莅临有方科技参观交流

    近日,广西壮族自治区党委书记、自治区人大常委会主任陈刚在南宁会见了深圳市有方科技股份有限公司董事长兼总经理王慷一行。双方围绕深化城市物联感知体系建设、AI硬件终端、场景AI解决方案、延伸具身人形机器人产业链等方面的议题进行了交流。
    的头像 发表于 08-12 11:42 ?324次阅读

    CYW43907系列在ModusToolbox的工程是否可以移植到Keil uVision中?

    CYW43907系列在ModusToolbox的工程是否可以移植到Keil uVision中,看见了官方推出的移植文档,但是不知道是否支持此芯片
    发表于 07-08 06:48

    精彩回顾 | TOSUN同星2025欧洲汽车测试展圆满落幕,期待下次再见

    5月20-22日,全球汽车测试技术盛会——欧洲汽车测试展(EuropeanAutomotiveTestingExpo2025)在德国圆满落幕。作为汽车电子基础工具链领域领先企业,TOSUN同星携多领域测试解决方案及最新发布产品矩阵重磅亮相,吸引了众多国际客户与行业专家的高度关注。现场直击ExhibitionSite展会期间,TOSUN同星展台吸引了来自来自欧
    的头像 发表于 05-23 20:06 ?360次阅读
    精彩回顾 | TOSUN同星2025欧洲汽车测试展圆满落幕,期待下次<b class='flag-5'>再见</b>!

    云知声积极推动厦门人工智能产业发展

    近日,厦门市市长伍斌在市政府会见了云知声创始人、CEO黄伟一行。双方就深化合作、共促厦门人工智能产业发展进行交流。
    的头像 发表于 04-22 16:19 ?362次阅读

    机器人的眼眸中,vivo看见了怎样的未来?

    从手机到机器人/MR,vivo对下一代交互的升维思考
    的头像 发表于 03-27 09:24 ?1814次阅读
    机器人的眼眸中,vivo看<b class='flag-5'>见了</b>怎样的未来?

    易飞扬致2025启动全员持股——坐稳800G 船,扬帆1.6T,再造相干通信

    瓜熟方能蒂落,成长需要历练。易飞扬宣布于2025年初启动职员类全员持股行动,向美好的明天说再见再见,不是不见,是再一次遇见!
    的头像 发表于 01-07 17:43 ?619次阅读
    易飞扬致2025启动全员持股——坐稳800G 船,扬帆1.6T,再造相干通信

    中汽中心与小鹏汽车座谈交流

    近日,中汽中心总经理陆梅在中汽政研北京办公区会见了广州小鹏汽车科技有限公司(以下简称“小鹏汽车”)董事长、首席执行官何小鹏一行。
    的头像 发表于 11-29 11:00 ?673次阅读

    虚拟化数据恢复—VMware ESX SERVER无法连接STORAGE的数据恢复案例

    某单位信息管理平台,数台VMware ESX SERVER共享一台某品牌DS4100存储。 vc报告虚拟磁盘丢失,管理员ssh到ESX中执行fdisk -l查看磁盘,发现STORAGE中的分区表不见了。重启所有设备后,ESX SERVER均无法连接到DS4100存储中的STORAGE。
    的头像 发表于 11-15 11:17 ?450次阅读

    ADS1292R dout引脚无法输出正常数据怎么解决?

    您好,我遇见了一个问题 DRDY引脚拉低后,DOUT引脚无数据输出 CH3为DRDY引脚信号 ,CH4为DOUT引脚信号,程序已验证可以正确读取芯片ID
    发表于 11-13 08:09

    求助,关于AIC3254_AEC_Framework的AEC设计问题求解

    ,各位专家,高手们?当添加其他的AIC3254Frame时,很多的AEC算法组件不见了。惨无人道啊,没有完整的AEC组件使用说明手册和资料,一片茫然。各位专家高手们,能不能指点一下到底该怎么办呢?55,谢谢了,感激万分
    发表于 11-08 08:01

    使用LMK04828芯片遇到的几个问题求解答

    我们最近在使用LMK04828芯片的时候遇见了这样的问题: 使用场景,使用了控制芯片为zynq 7045 的SPI xai ip做的控制,使用SPI四线模式来完成读写,使用管脚(MISO)为
    发表于 11-08 07:11

    软通动力领导一行访问福州大学

    软通动力高级副总裁王晓良、杨念农,软通教育总裁林涛及福建新东湖集团有限公司董事长陈国平一行来访福州大学。校党委陈国龙书记在行政南楼会见了客人并座谈交流,郭文忠副校长陪同会见。
    的头像 发表于 10-10 10:43 ?919次阅读

    使用LMH6401遇见了通频带不平坦的问题,怎么解决?

    我在使用TI公司的DVGA LMH6401的时候遇见了通频带不平坦的问题。设计电路为三级LMH6401+三级LMH6401,希望实现了80多dB的动态调节范围,其中遇到了两个问题,第一个就是通频带
    发表于 09-05 06:18

    重庆两江新区与吉利汽车集团、旷视科技签署合作协议

    日前,重庆两江新区与吉利汽车集团、旷视科技签署战略合作协议。市委书记袁家军,市委副书记、市长胡衡华会见了吉利控股集团董事长李书福、旷视科技董事长兼CEO印奇一行并见证签约。
    的头像 发表于 09-02 14:13 ?920次阅读

    再见深圳!飞凌嵌入式技术创新日圆满落幕

    2024年8月26日下午,飞凌嵌入式技术创新日深圳站在深圳威尼斯英迪格酒店盛大举行,此次活动汇聚了近200位嵌入式技术领域的专家和企业代表,共享嵌入式技术的盛宴,共创嵌入式技术的美好未来!进入活动现场,首先吸引目光的便是精心布置的迎宾互动区域。飞凌嵌入式以独特创意,为每位来宾呈上蕴含幸运寓意的彩票红包,旨在传递满满的好运,也尽显趣味。来宾们积极参与互动,现场
    的头像 发表于 08-29 16:35 ?1424次阅读
    <b class='flag-5'>再见</b>深圳!飞凌嵌入式技术创新日圆满落幕