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

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

3天内不再提示

权限框架jcasbin的角色权限配置

Android编程精选 来源:Android编程精选 作者:Android编程精选 2022-10-21 10:58 次阅读

前言

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

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

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

一、准备

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

1、mavan仓库引入


org.casbin
jcasbin
1.1.0


org.casbin
jdbc-adapter
1.1.0

2、配置文件

jcasbin把用户的角色、权限信息(访问路径)放置在配置文件里,然后通过输入流读取配置文件。主要有两个配置文件:model.conf 和 policy.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

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

我们要对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

    文章

    398

    浏览量

    17393
  • 数据库
    +关注

    关注

    7

    文章

    3750

    浏览量

    64217
  • GitHub
    +关注

    关注

    3

    文章

    464

    浏览量

    16352

原文标题:发现一款更轻量级的权限框架,十分钟就能快速上手,yyds

文章出处:【微信号:AndroidPush,微信公众号:Android编程精选】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    iMatrix平台核心功能—权限管理介绍

    ,换言之,这三个角色比其他角色拥有更高级的权限,更像是管理员或者管理角色,这种设计在很多重要的业务系统中非常实用。功能介绍功能框架图: 组织
    发表于 07-11 11:59

    一个通用的权限管理模型的设计方案

    本文提出了一种集成功能权限和数据权限的通用的权限管理模型,该模型在主要对角色授权的基础上加入了对用户直接授权和屏蔽部分角色
    发表于 05-26 10:34 28次下载

    基于规则引擎的实例级权限控制研究

    该文通过比较常用的权限控制的实现方法,提出了基于规则引擎的实例级权限控制框架,能灵活实现复杂的安全策略。关键词: Java 认证授权服务;安全注释框架;规则引擎;
    发表于 09-03 12:12 16次下载

    基于角色的多约束动态权限管理模型

    在基于角色的访问控制模型(RBAC)基础上,引入访问终端、网络环境和接入方式等外部因素,提出了基于角色的多约束动态权限管理模型,依据外部因素的安全程度和资源可能带来安全风险分别对外部因素和资源进行
    发表于 11-14 11:17 6次下载
    基于<b class='flag-5'>角色</b>的多约束动态<b class='flag-5'>权限</b>管理模型

    详细剖析有数BI的权限体系!

    业务中的复杂场景,又能简洁易用,今天我们将详细介绍有数BI的权限体系! 角色模型   对于权限管理,最简单的办法就是给每个用户配不同的权限,但这样的设计在用户较多时维护起来就显得非常力
    的头像 发表于 04-13 11:00 3380次阅读
    详细剖析有数BI的<b class='flag-5'>权限</b>体系!

    鸿蒙APP开发鸿蒙权限请求框架

    关于 HarmonyOS 的动态授权的常规操作流程和代码我之前写过一篇文章:《鸿蒙动态权限申请完整规范流程和操作详解》。 文章地址如下: https://harmonyos.51cto.com
    的头像 发表于 09-28 09:19 2833次阅读

    如何使用鸿蒙系统上权限请求框架桃夭

       桃夭是鸿蒙系统上的一款权限请求框架,对请求权限的代码进行高度封装,极大的简化了申请权限的代码逻辑,同时支持在 Ability、FractionAbility、AbilitySli
    的头像 发表于 11-10 09:34 2086次阅读

    一款好用的鸿蒙系统上的权限请求框架

       桃夭是鸿蒙系统上的一款权限请求框架,对请求权限的代码进行高度封装,极大的简化了申请权限的代码逻辑,同时支持在 Ability、FractionAbility、AbilitySli
    的头像 发表于 12-03 10:10 1822次阅读

    erp用户权限管理怎么做

    执行一些操作,给系统数据及公司业务安全带来风险。到底erp用户权限管理该怎么做呢? erp用户权限管理: 1 、ERP系统的授权机制 很多ERP系统采用的是目前国际上比较流行的基于角色的访问机制(Role-Based Acces
    的头像 发表于 12-02 14:50 2204次阅读

    基于角色的松耦合式权限控制设计

    主体采用RBAC(Role-Base Access Control,基于角色的访问控制)模型,就是用户通过角色权限进行关联实现,多对多的用户角色关系模式。
    的头像 发表于 01-12 14:31 793次阅读

    一个轻量级的权限认证框架:Sa-Token

    Java有很多优秀的权限认证框架,如 Apache Shiro 、 Spring Security 等,但是集成起来实在是有些复杂;今天给大家介绍一个轻量级的权限认证框架:Sa-Tok
    的头像 发表于 09-30 16:46 1827次阅读
    一个轻量级的<b class='flag-5'>权限</b>认证<b class='flag-5'>框架</b>:Sa-Token

    Linux文件权限及Makefile

    的详细信息 //man -L zh_CN open man 1 open man 2 open man 3 open Part2文件权限 2.1 权限理解 在 Ubuntu(以及其他类 UNIX
    的头像 发表于 11-24 16:06 523次阅读
    Linux文件<b class='flag-5'>权限</b>及Makefile

    oracle系统权限和对象权限的区别

    权限和对象权限的区别。 一、Oracle系统权限 Oracle系统权限是授予用户对数据库系统级别操作的权限,用户可以使用这些
    的头像 发表于 12-05 16:21 906次阅读

    前端大仓monorepo权限设计思路和实现方案

    在 GitLab 未支持文件目录权限设置之前,对于文件目录权限的控制主要依赖 Git 的钩子函数,在代码提交的时候,对暂存区的变更文件进行识别并做文件权限校验,流程设计也不怎么复杂,只需要额外再开发文件目录和研发的
    的头像 发表于 01-12 09:52 635次阅读
    前端大仓monorepo<b class='flag-5'>权限</b>设计思路和实现方案

    鸿蒙开发Ability Kit程序框架服务:声明权限

    应用在申请权限时,需要在项目的配置文件中,逐个声明需要的权限,否则应用将无法获取授权。
    的头像 发表于 07-01 09:22 266次阅读
    鸿蒙开发Ability Kit程序<b class='flag-5'>框架</b>服务:声明<b class='flag-5'>权限</b>