吴忠躺衫网络科技有限公司

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

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

Android編程精選 ? 來源:Android編程精選 ? 作者:Android編程精選 ? 2022-10-21 10:58 ? 次閱讀

前言

作為一名后臺開發(fā)人員,權限這個名詞應該算是特別熟悉的了。就算是java里的類也有 public、private 等“權限”之分。之前項目里一直使用shiro作為權限管理的框架。說實話,shiro的確挺強大的,但是它也有很多不好的地方。shiro默認的登錄地址還是login.jsp,前后端分離模式使用shiro還要重寫好多類;手機端存儲用戶信息、保持登錄狀態(tài)等等,對shiro來說也是一個難題。

在分布式項目里,比如電商項目,其實不太需要明確的權限劃分,說白了,我認為沒必要做太麻煩的權限管理,一切從簡。何況shiro對于springCloud等各種分布式框架來說,簡直就是“災難”。每個子系統里都要寫點shiro的東西,慢慢的,越來越惡心。zuul網關就在這里大顯身手了,控制用戶的登錄,鑒定用戶的權限等等。zuul網關控制用戶登錄,鑒權以后再詳說。以上拙見。

然后最近我發(fā)現了另一個權限框架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里都講了,在此就不再贅述了。

其實也可以讀取數據庫的角色權限配置。所以我們可以把關于數據庫的信息提取出來,可以進行動態(tài)設置。

@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,在容器加載的時候就初始化這個類,方便后續(xù)的使用。

@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;
}


}

在這個類里,我們注入寫好的配置類,然后轉為靜態(tài)的,在afterPropertiesSet方法里實例化Enforcer并加載policy(策略,角色權限/url對應關系)。

同時又寫了兩個方法,用來添加和刪除policy,Policy是自定的一個類,對官方使用的集合/數組進行了封裝。

publicclassPolicy{
/**想要訪問資源的用戶或者角色*/
privateStringsub;

/**將要訪問的資源,可以使用*作為通配符,例如/user/**/
privateStringobj;

/**用戶對資源執(zhí)行的操作。HTTP方法,GET、POST、PUT、DELETE等,可以使用*作為通配符*/
privateStringact;

publicPolicy(){
super();
}

/**
*
*@paramsub想要訪問資源的用戶或者角色
*@paramobj將要訪問的資源,可以使用*作為通配符,例如/user/*
*@paramact 用戶對資源執(zhí)行的操作。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)//執(zhí)行順序,最高級別最先執(zhí)行,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)這個方法對用戶、訪問資源、方式進行匹配。這里的邏輯可以根據自己的業(yè)務來實現。在這個過濾器之前還可以添加一個判斷用戶是否登錄的過濾器。

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即可,其他地方基本沒啥區(qū)別。

審核編輯:彭靜
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規(guī)問題,請聯系本站處理。 舉報投訴
  • 框架
    +關注

    關注

    0

    文章

    403

    瀏覽量

    17543
  • 數據庫
    +關注

    關注

    7

    文章

    3848

    瀏覽量

    64690
  • GitHub
    +關注

    關注

    3

    文章

    473

    瀏覽量

    16566

原文標題:發(fā)現一款更輕量級的權限框架,十分鐘就能快速上手,yyds

文章出處:【微信號:AndroidPush,微信公眾號:Android編程精選】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    iMatrix平臺核心功能—權限管理介紹

    ,換言之,這三個角色比其他角色擁有更高級的權限,更像是管理員或者管理角色,這種設計在很多重要的業(yè)務系統中非常實用。功能介紹功能框架圖: 組織
    發(fā)表于 07-11 11:59

    一個通用的權限管理模型的設計方案

    本文提出了一種集成功能權限和數據權限的通用的權限管理模型,該模型在主要對角色授權的基礎上加入了對用戶直接授權和屏蔽部分角色
    發(fā)表于 05-26 10:34 ?28次下載

    基于規(guī)則引擎的實例級權限控制研究

    該文通過比較常用的權限控制的實現方法,提出了基于規(guī)則引擎的實例級權限控制框架,能靈活實現復雜的安全策略。關鍵詞: Java 認證授權服務;安全注釋框架;規(guī)則引擎;
    發(fā)表于 09-03 12:12 ?16次下載

    基于角色的多約束動態(tài)權限管理模型

    在基于角色的訪問控制模型(RBAC)基礎上,引入訪問終端、網絡環(huán)境和接入方式等外部因素,提出了基于角色的多約束動態(tài)權限管理模型,依據外部因素的安全程度和資源可能帶來安全風險分別對外部因素和資源進行
    發(fā)表于 11-14 11:17 ?6次下載
    基于<b class='flag-5'>角色</b>的多約束動態(tài)<b class='flag-5'>權限</b>管理模型

    詳細剖析有數BI的權限體系!

    業(yè)務中的復雜場景,又能簡潔易用,今天我們將詳細介紹有數BI的權限體系! 角色模型 ? 對于權限管理,最簡單的辦法就是給每個用戶配不同的權限,但這樣的設計在用戶較多時維護起來就顯得非常力
    的頭像 發(fā)表于 04-13 11:00 ?3565次閱讀
    詳細剖析有數BI的<b class='flag-5'>權限</b>體系!

    鴻蒙APP開發(fā)鴻蒙權限請求框架

    關于 HarmonyOS 的動態(tài)授權的常規(guī)操作流程和代碼我之前寫過一篇文章:《鴻蒙動態(tài)權限申請完整規(guī)范流程和操作詳解》。 文章地址如下: https://harmonyos.51cto.com
    的頭像 發(fā)表于 09-28 09:19 ?3049次閱讀

    如何使用鴻蒙系統上權限請求框架桃夭

    ?? 桃夭是鴻蒙系統上的一款權限請求框架,對請求權限的代碼進行高度封裝,極大的簡化了申請權限的代碼邏輯,同時支持在 Ability、FractionAbility、AbilitySli
    的頭像 發(fā)表于 11-10 09:34 ?2191次閱讀

    一款好用的鴻蒙系統上的權限請求框架

    ?? 桃夭是鴻蒙系統上的一款權限請求框架,對請求權限的代碼進行高度封裝,極大的簡化了申請權限的代碼邏輯,同時支持在 Ability、FractionAbility、AbilitySli
    的頭像 發(fā)表于 12-03 10:10 ?1938次閱讀

    erp用戶權限管理怎么做

    執(zhí)行一些操作,給系統數據及公司業(yè)務安全帶來風險。到底erp用戶權限管理該怎么做呢? erp用戶權限管理: 1 、ERP系統的授權機制 很多ERP系統采用的是目前國際上比較流行的基于角色的訪問機制(Role-Based Acces
    的頭像 發(fā)表于 12-02 14:50 ?2291次閱讀

    基于角色的松耦合式權限控制設計

    主體采用RBAC(Role-Base Access Control,基于角色的訪問控制)模型,就是用戶通過角色權限進行關聯實現,多對多的用戶角色關系模式。
    的頭像 發(fā)表于 01-12 14:31 ?915次閱讀

    一個輕量級的權限認證框架:Sa-Token

    Java有很多優(yōu)秀的權限認證框架,如 Apache Shiro 、 Spring Security 等,但是集成起來實在是有些復雜;今天給大家介紹一個輕量級的權限認證框架:Sa-Tok
    的頭像 發(fā)表于 09-30 16:46 ?2239次閱讀
    一個輕量級的<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
    的頭像 發(fā)表于 11-24 16:06 ?644次閱讀
    Linux文件<b class='flag-5'>權限</b>及Makefile

    oracle系統權限和對象權限的區(qū)別

    權限和對象權限的區(qū)別。 一、Oracle系統權限 Oracle系統權限是授予用戶對數據庫系統級別操作的權限,用戶可以使用這些
    的頭像 發(fā)表于 12-05 16:21 ?1220次閱讀

    鴻蒙開發(fā)Ability Kit程序框架服務:聲明權限

    應用在申請權限時,需要在項目的配置文件中,逐個聲明需要的權限,否則應用將無法獲取授權。
    的頭像 發(fā)表于 07-01 09:22 ?393次閱讀
    鴻蒙開發(fā)Ability Kit程序<b class='flag-5'>框架</b>服務:聲明<b class='flag-5'>權限</b>

    華納云:設置RBAC權限的方法

    : ? ?為每個角色定義一組權限權限應該與角色的職責相匹配,確保角色能夠執(zhí)行其工作所需的操作,同時遵守最小
    的頭像 發(fā)表于 11-11 16:20 ?267次閱讀
    皇冠网百家乐平台| 莫斯科百家乐官网的玩法技巧和规则 | 六合彩资料| 柬埔寨百家乐的玩法技巧和规则| 风水罗盘24方位| 新澳门百家乐官网娱乐城| 盈得利| 缅甸百家乐赌场| 百家乐玩法秘诀| 百家乐官网出千方法技巧| 四川省| 大发888怎么玩不了| 百家乐赌博平台| G3百家乐官网的玩法技巧和规则 | 百家乐博赌场娱乐网规则| 24山吉凶段| 国际足球直播| 全讯网信息| 狮威百家乐娱乐平台| 做生意住房买什么朝向| 百家乐官网游戏模拟| 百家乐官网游戏机子| 瑞丰娱乐| 大发888老虎机官方| 百博百家乐的玩法技巧和规则| 百家乐有几种打法| 真人百家乐官网免费送钱| 百家乐官网高手长胜攻略| 线上娱乐城| 大嘴棋牌手机版| 威尼斯人娱乐城 104| 百家乐娱乐网真钱游戏| 百家乐3带厂家地址| 百家乐官网14克粘土筹码| 易胜博百家乐官网作弊| 百家乐官网摇色子网站| 蓬安县| 足球竞猜| 宝都棋牌下载| 大发888真钱官网| 二八杠游戏平台|