一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

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

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

權(quán)限框架jcasbin的角色權(quán)限配置

Android編程精選 ? 來(lái)源:Android編程精選 ? 作者:Android編程精選 ? 2022-10-21 10:58 ? 次閱讀

前言

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

在分布式項(xiàng)目里,比如電商項(xiàng)目,其實(shí)不太需要明確的權(quán)限劃分,說(shuō)白了,我認(rèn)為沒(méi)必要做太麻煩的權(quán)限管理,一切從簡(jiǎn)。何況shiro對(duì)于springCloud等各種分布式框架來(lái)說(shuō),簡(jiǎn)直就是“災(zāi)難”。每個(gè)子系統(tǒng)里都要寫(xiě)點(diǎn)shiro的東西,慢慢的,越來(lái)越惡心。zuul網(wǎng)關(guān)就在這里大顯身手了,控制用戶(hù)的登錄,鑒定用戶(hù)的權(quán)限等等。zuul網(wǎng)關(guān)控制用戶(hù)登錄,鑒權(quán)以后再詳說(shuō)。以上拙見(jiàn)。

然后最近我發(fā)現(xiàn)了另一個(gè)權(quán)限框架jcasbin,雖然網(wǎng)上還沒(méi)有很多關(guān)于博客,但是我看了一會(huì)就可以使用了。

一、準(zhǔn)備

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

1、mavan倉(cāng)庫(kù)引入


org.casbin
jcasbin
1.1.0


org.casbin
jdbc-adapter
1.1.0

2、配置文件

jcasbin把用戶(hù)的角色、權(quán)限信息(訪(fǎng)問(wèn)路徑)放置在配置文件里,然后通過(guò)輸入流讀取配置文件。主要有兩個(gè)配置文件:model.conf 和 policy.csv。簡(jiǎn)單的使用GitHub里都講了,在此就不再贅述了。

其實(shí)也可以讀取數(shù)據(jù)庫(kù)的角色權(quán)限配置。所以我們可以把關(guān)于數(shù)據(jù)庫(kù)的信息提取出來(lái),可以進(jìn)行動(dòng)態(tài)設(shè)置。

@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里進(jìn)行相關(guān)配置了。model.conf是固定的文件,之間復(fù)制過(guò)來(lái)放在新建的和src同級(jí)的文件夾下即可。policy.csv的內(nèi)容是可以從數(shù)據(jù)庫(kù)讀取的。

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

二、讀取權(quán)限信息進(jìn)行初始化

我們要對(duì)Enforcer這個(gè)類(lèi)初始化,加載配置文件里的信息。所以我們寫(xiě)一個(gè)類(lèi)實(shí)現(xiàn)InitializingBean,在容器加載的時(shí)候就初始化這個(gè)類(lèi),方便后續(xù)的使用。

@Component
publicclassEnforcerFactoryimplementsInitializingBean{

privatestaticEnforcerenforcer;

@Autowired
privateEnforcerConfigPropertiesenforcerConfigProperties;
privatestaticEnforcerConfigPropertiesconfig;

@Override
publicvoidafterPropertiesSet()throwsException{
config=enforcerConfigProperties;
//從數(shù)據(jù)庫(kù)讀取策略
JDBCAdapterjdbcAdapter=newJDBCAdapter(config.getDriverClassName(),config.getUrl(),config.getUsername(),
config.getPassword(),true);
enforcer=newEnforcer(config.getModelPath(),jdbcAdapter);
enforcer.loadPolicy();//LoadthepolicyfromDB.
}

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

returnaddPolicy;
}

/**
*刪除權(quán)限
*@parampolicy
*@return
*/
publicstaticbooleanremovePolicy(Policypolicy){
booleanremovePolicy=enforcer.removePolicy(policy.getSub(),policy.getObj(),policy.getAct());
enforcer.savePolicy();

returnremovePolicy;
}

publicstaticEnforcergetEnforcer(){
returnenforcer;
}


}

在這個(gè)類(lèi)里,我們注入寫(xiě)好的配置類(lèi),然后轉(zhuǎn)為靜態(tài)的,在afterPropertiesSet方法里實(shí)例化Enforcer并加載policy(策略,角色權(quán)限/url對(duì)應(yīng)關(guān)系)。

同時(shí)又寫(xiě)了兩個(gè)方法,用來(lái)添加和刪除policy,Policy是自定的一個(gè)類(lèi),對(duì)官方使用的集合/數(shù)組進(jìn)行了封裝。

publicclassPolicy{
/**想要訪(fǎng)問(wèn)資源的用戶(hù)或者角色*/
privateStringsub;

/**將要訪(fǎng)問(wèn)的資源,可以使用*作為通配符,例如/user/**/
privateStringobj;

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

publicPolicy(){
super();
}

/**
*
*@paramsub想要訪(fǎng)問(wèn)資源的用戶(hù)或者角色
*@paramobj將要訪(fǎng)問(wèn)的資源,可以使用*作為通配符,例如/user/*
*@paramact 用戶(hù)對(duì)資源執(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、權(quán)限控制

jcasbin的權(quán)限控制非常簡(jiǎn)單,自定義一個(gè)過(guò)濾器,if判斷就可以搞定,沒(méi)錯(cuò),就這么簡(jiǎn)單。

@WebFilter(urlPatterns="/*",filterName="JCasbinAuthzFilter")
@Order(Ordered.HIGHEST_PRECEDENCE)//執(zhí)行順序,最高級(jí)別最先執(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("無(wú)權(quán)訪(fǎng)問(wèn)");
Mapresult=newHashMap();
result.put("code",1001);
result.put("msg","用戶(hù)權(quán)限不足");
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)這個(gè)方法對(duì)用戶(hù)、訪(fǎng)問(wèn)資源、方式進(jìn)行匹配。這里的邏輯可以根據(jù)自己的業(yè)務(wù)來(lái)實(shí)現(xiàn)。在這個(gè)過(guò)濾器之前還可以添加一個(gè)判斷用戶(hù)是否登錄的過(guò)濾器。

2、添加刪除權(quán)限

對(duì)于權(quán)限的操作,直接調(diào)用上面寫(xiě)好的EnforcerFactory里對(duì)應(yīng)的方法即可。并且,可以達(dá)到同步的效果。就是不用重啟服務(wù)器或者其他任何操作,添加或刪除用戶(hù)權(quán)限后,用戶(hù)對(duì)應(yīng)的訪(fǎng)問(wèn)就會(huì)收到影響。

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

寫(xiě)在后面的話(huà)

其實(shí)可以把jcasbin和SpringCloud的zuul結(jié)合來(lái)實(shí)現(xiàn)用戶(hù)的統(tǒng)一登錄和權(quán)限控制。自定義一個(gè)過(guò)濾器繼承ZuulFilter即可,其他地方基本沒(méi)啥區(qū)別。

審核編輯:彭靜
聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 框架
    +關(guān)注

    關(guān)注

    0

    文章

    404

    瀏覽量

    17740
  • 數(shù)據(jù)庫(kù)
    +關(guān)注

    關(guān)注

    7

    文章

    3884

    瀏覽量

    65584
  • GitHub
    +關(guān)注

    關(guān)注

    3

    文章

    481

    瀏覽量

    17330

原文標(biāo)題:發(fā)現(xiàn)一款更輕量級(jí)的權(quán)限框架,十分鐘就能快速上手,yyds

文章出處:【微信號(hào):AndroidPush,微信公眾號(hào):Android編程精選】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    iMatrix平臺(tái)核心功能—權(quán)限管理介紹

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

    一個(gè)通用的權(quán)限管理模型的設(shè)計(jì)方案

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

    基于規(guī)則引擎的實(shí)例級(jí)權(quán)限控制研究

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

    基于角色的多約束動(dòng)態(tài)權(quán)限管理模型

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

    詳細(xì)剖析有數(shù)BI的權(quán)限體系!

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

    鴻蒙APP開(kāi)發(fā)鴻蒙權(quán)限請(qǐng)求框架

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

    如何使用鴻蒙系統(tǒng)上權(quán)限請(qǐng)求框架桃夭

    ?? 桃夭是鴻蒙系統(tǒng)上的一款權(quán)限請(qǐng)求框架,對(duì)請(qǐng)求權(quán)限的代碼進(jìn)行高度封裝,極大的簡(jiǎn)化了申請(qǐng)權(quán)限的代碼邏輯,同時(shí)支持在 Ability、FractionAbility、AbilitySli
    的頭像 發(fā)表于 11-10 09:34 ?2339次閱讀

    一款好用的鴻蒙系統(tǒng)上的權(quán)限請(qǐng)求框架

    ?? 桃夭是鴻蒙系統(tǒng)上的一款權(quán)限請(qǐng)求框架,對(duì)請(qǐng)求權(quán)限的代碼進(jìn)行高度封裝,極大的簡(jiǎn)化了申請(qǐng)權(quán)限的代碼邏輯,同時(shí)支持在 Ability、FractionAbility、AbilitySli
    的頭像 發(fā)表于 12-03 10:10 ?2093次閱讀

    erp用戶(hù)權(quán)限管理怎么做

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

    基于角色的松耦合式權(quán)限控制設(shè)計(jì)

    主體采用RBAC(Role-Base Access Control,基于角色的訪(fǎng)問(wèn)控制)模型,就是用戶(hù)通過(guò)角色權(quán)限進(jìn)行關(guān)聯(lián)實(shí)現(xiàn),多對(duì)多的用戶(hù)角色關(guān)系模式。
    的頭像 發(fā)表于 01-12 14:31 ?1052次閱讀

    一個(gè)輕量級(jí)的權(quán)限認(rèn)證框架:Sa-Token

    Java有很多優(yōu)秀的權(quán)限認(rèn)證框架,如 Apache Shiro 、 Spring Security 等,但是集成起來(lái)實(shí)在是有些復(fù)雜;今天給大家介紹一個(gè)輕量級(jí)的權(quán)限認(rèn)證框架:Sa-Tok
    的頭像 發(fā)表于 09-30 16:46 ?2768次閱讀
    一個(gè)輕量級(jí)的<b class='flag-5'>權(quán)限</b>認(rèn)證<b class='flag-5'>框架</b>:Sa-Token

    Linux文件權(quán)限及Makefile

    的詳細(xì)信息 //man -L zh_CN open man 1 open man 2 open man 3 open Part2文件權(quán)限 2.1 權(quán)限理解 在 Ubuntu(以及其他類(lèi) UNIX
    的頭像 發(fā)表于 11-24 16:06 ?731次閱讀
    Linux文件<b class='flag-5'>權(quán)限</b>及Makefile

    oracle系統(tǒng)權(quán)限和對(duì)象權(quán)限的區(qū)別

    權(quán)限和對(duì)象權(quán)限的區(qū)別。 一、Oracle系統(tǒng)權(quán)限 Oracle系統(tǒng)權(quán)限是授予用戶(hù)對(duì)數(shù)據(jù)庫(kù)系統(tǒng)級(jí)別操作的權(quán)限,用戶(hù)可以使用這些
    的頭像 發(fā)表于 12-05 16:21 ?1440次閱讀

    鴻蒙開(kāi)發(fā)Ability Kit程序框架服務(wù):聲明權(quán)限

    應(yīng)用在申請(qǐng)權(quán)限時(shí),需要在項(xiàng)目的配置文件中,逐個(gè)聲明需要的權(quán)限,否則應(yīng)用將無(wú)法獲取授權(quán)。
    的頭像 發(fā)表于 07-01 09:22 ?534次閱讀
    鴻蒙開(kāi)發(fā)Ability Kit程序<b class='flag-5'>框架</b>服務(wù):聲明<b class='flag-5'>權(quán)限</b>

    華納云:設(shè)置RBAC權(quán)限的方法

    : ? ?為每個(gè)角色定義一組權(quán)限。權(quán)限應(yīng)該與角色的職責(zé)相匹配,確保角色能夠執(zhí)行其工作所需的操作,同時(shí)遵守最小
    的頭像 發(fā)表于 11-11 16:20 ?463次閱讀