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

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

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

再見(jiàn)了shiro

jf_ro2CN3Fa ? 來(lái)源:CSDN ? 2023-01-15 11:32 ? 次閱讀


前言

作為一名后臺(tái)開(kāi)發(fā)人員,權(quán)限這個(gè)名詞應(yīng)該算是特別熟悉的了。就算是java里的類也有 public、private 等“權(quán)限”之分。之前項(xiàng)目里一直使用shiro作為權(quán)限管理的框架。說(shuō)實(shí)話,shiro的確挺強(qiáng)大的,但是它也有很多不好的地方。shiro默認(rèn)的登錄地址還是login.jsp,前后端分離模式使用shiro還要重寫好多類;手機(jī)端存儲(chǔ)用戶信息、保持登錄狀態(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)里都要寫點(diǎn)shiro的東西,慢慢的,越來(lái)越惡心。zuul網(wǎng)關(guān)就在這里大顯身手了,控制用戶的登錄,鑒定用戶的權(quán)限等等。zuul網(wǎng)關(guān)控制用戶登錄,鑒權(quán)以后再詳說(shuō)。以上拙見(jiàn)。

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

順手貼上github地址:https://github.com/casbin/jcasbin

基于 Spring Boot + MyBatis Plus + Vue & Element 實(shí)現(xiàn)的后臺(tái)管理系統(tǒng) + 用戶小程序,支持 RBAC 動(dòng)態(tài)權(quán)限、多租戶、數(shù)據(jù)權(quán)限、工作流、三方登錄、支付、短信、商城等功能

  • 項(xiàng)目地址:https://github.com/YunaiV/ruoyi-vue-pro
  • 視頻教程:https://doc.iocoder.cn/video/

一、準(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把用戶的角色、權(quán)限信息(訪問(wèn)路徑)放置在配置文件里,然后通過(guò)輸入流讀取配置文件。主要有兩個(gè)配置文件:model.confpolicy.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

基于 Spring Cloud Alibaba + Gateway + Nacos + RocketMQ + Vue & Element 實(shí)現(xiàn)的后臺(tái)管理系統(tǒng) + 用戶小程序,支持 RBAC 動(dòng)態(tài)權(quán)限、多租戶、數(shù)據(jù)權(quán)限、工作流、三方登錄、支付、短信、商城等功能

  • 項(xiàng)目地址:https://github.com/YunaiV/yudao-cloud
  • 視頻教程:https://doc.iocoder.cn/video/

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

我們要對(duì)Enforcer這個(gè)類初始化,加載配置文件里的信息。所以我們寫一個(gè)類實(shí)現(xiàn)InitializingBean,在容器加載的時(shí)候就初始化這個(gè)類,方便后續(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è)類里,我們注入寫好的配置類,然后轉(zhuǎn)為靜態(tài)的,在afterPropertiesSet方法里實(shí)例化Enforcer并加載policy(策略,角色權(quán)限/url對(duì)應(yīng)關(guān)系)。

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

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

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

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

publicPolicy(){
super();
}

/**
*
*@paramsub想要訪問(wèn)資源的用戶或者角色
*@paramobj將要訪問(wèn)的資源,可以使用*作為通配符,例如/user/*
*@paramact用戶對(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)訪問(wèn)");
Mapresult=newHashMap();
result.put("code",1001);
result.put("msg","用戶權(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ì)用戶、訪問(wèn)資源、方式進(jìn)行匹配。這里的邏輯可以根據(jù)自己的業(yè)務(wù)來(lái)實(shí)現(xiàn)。在這個(gè)過(guò)濾器之前還可以添加一個(gè)判斷用戶是否登錄的過(guò)濾器。

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

對(duì)于權(quán)限的操作,直接調(diào)用上面寫好的EnforcerFactory里對(duì)應(yīng)的方法即可。并且,可以達(dá)到同步的效果。就是不用重啟服務(wù)器或者其他任何操作,添加或刪除用戶權(quán)限后,用戶對(duì)應(yī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();
}

		

寫在后面的話

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

審核編輯 :李倩


聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(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

    文章

    397

    瀏覽量

    17358
  • spring
    +關(guān)注

    關(guān)注

    0

    文章

    335

    瀏覽量

    14277
  • 過(guò)濾器
    +關(guān)注

    關(guān)注

    1

    文章

    424

    瀏覽量

    19484

原文標(biāo)題:再見(jiàn)了 shiro

文章出處:【微信號(hào):芋道源碼,微信公眾號(hào):芋道源碼】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    使用LMH6401遇見(jiàn)了通頻帶不平坦的問(wèn)題,怎么解決?

    我在使用TI公司的DVGA LMH6401的時(shí)候遇見(jiàn)了通頻帶不平坦的問(wèn)題。設(shè)計(jì)電路為三級(jí)LMH6401+三級(jí)LMH6401,希望實(shí)現(xiàn)了80多dB的動(dòng)態(tài)調(diào)節(jié)范圍,其中遇到了兩個(gè)問(wèn)題,第一個(gè)就是通頻帶
    發(fā)表于 09-05 06:18

    請(qǐng)問(wèn)AMC1351是否可以用做交流電壓的檢測(cè)?

    AMC1311, AMC1411, AMC1350在這個(gè)器件的一些參數(shù)說(shuō)明中我看見(jiàn)了該隔離放大器可用于直流檢測(cè),但我的應(yīng)用需求是用于交流電壓的檢測(cè),該隔離運(yùn)放可以幫我達(dá)成這個(gè)目標(biāo)嗎?差不多類型的AMC1211、AMC1311、AMC1411是否也能呢,希望能得到您的回復(fù),謝謝。
    發(fā)表于 08-02 06:01

    如何正確的將lv_port_esp32的LVGL部分合并到ESP_IDF中呢?

    我使用lv_port_esp32測(cè)試LVGL顯示正常,但是在將其合并到我自己基于ESP_IDF(v4.2.1)工程中的時(shí)候遇見(jiàn)了問(wèn)題。我將lv_examples、lvgl
    發(fā)表于 06-21 12:43

    CYT4BF8CEDQ0AESGS使用IAR9.32進(jìn)行編譯運(yùn)行了freertos,jlink仿真后程序會(huì)在vPortStartFirstTask 的svc 0卡死的原因?

    我現(xiàn)在在用CYT4BF8CEDQ0AESGS這一款芯片,使用IAR9.32進(jìn)行編譯,運(yùn)行了freertos,但是碰見(jiàn)了一個(gè)問(wèn)題,程序在用自己做的串口BootLoader升級(jí)是可以正常運(yùn)行的,但是
    發(fā)表于 05-29 07:36

    MDK5.23將C/C++的字體由系統(tǒng)默認(rèn)的Courier New切換為Consolas字體,再切換回去Courier New字體選項(xiàng)不見(jiàn)了?

    MDK5.23,將C/C++的字體由系統(tǒng)默認(rèn)的Courier New切換為Consolas字體,想再切換回去的時(shí)候,發(fā)現(xiàn)Courier New字體選項(xiàng)居然不見(jiàn)了??百思不得其解,這難道還有什么特殊的地方??求助??!
    發(fā)表于 04-23 07:09

    ST-Link驅(qū)動(dòng)不見(jiàn)了怎么解決?

    用了很久的ST-Link驅(qū)動(dòng)突然不見(jiàn)了,重新安裝設(shè)備管理器里面也沒(méi)有,電腦重啟也沒(méi)用,到底怎么了,應(yīng)該怎么辦?[/tr]
    發(fā)表于 03-18 06:37

    在STM32F407上使用DMA給TIM2的CCR4寫值,高位出現(xiàn)0x64沒(méi)有波形產(chǎn)生怎么處理?

    在STM32F407上使用DMA給TIM2的CCR4寫值,輸出固定個(gè)數(shù)PWM波個(gè)數(shù)時(shí),遇見(jiàn)了CCR4的高位與低位同時(shí)被寫入相同的值,如圖所示 在DEBUG時(shí)可以看見(jiàn)CCR4的高16位與低16位同時(shí)被賦值了,但是在內(nèi)存中,我只存了0x64,為什么會(huì)出現(xiàn)高位也出現(xiàn)0x64,導(dǎo)致沒(méi)有波形產(chǎn)生。
    發(fā)表于 03-11 08:04

    CY4500找到不行到驅(qū)動(dòng)的原因?

    你好,我買了 CY4500板子,下載了 EZ-PD 協(xié)議分析器實(shí)用程序,但是電腦并沒(méi)有 checktest到cy4500的驅(qū)逐出動(dòng)。我看見(jiàn)了區(qū)上說(shuō),最新版本不用了額外下載驅(qū)動(dòng)的。根據(jù)在區(qū)內(nèi)看到 winusb.sys,我找到了 winusb.sys 并嘗試了選擇手動(dòng)更新新驅(qū)動(dòng),但是還沒(méi)有成功。
    發(fā)表于 02-23 08:01

    一個(gè)簡(jiǎn)單的Shiro RCE檢測(cè)和利用腳本

    一個(gè)簡(jiǎn)單的Shiro RCE檢測(cè)和利用腳本。
    的頭像 發(fā)表于 01-09 09:46 ?541次閱讀

    揮手2023,我們2024再見(jiàn)

    光學(xué)儀器儀器儀表
    上海嫦娥光學(xué)儀器科技有限公司
    發(fā)布于 :2024年01月02日 11:19:35

    揮別2023,展望2024

    —— Microchip愿與您攜手并進(jìn),共創(chuàng)未來(lái) Microchip 總裁兼首席執(zhí)行官 GaneshMoorthy 就要和2023說(shuō)再見(jiàn)了。值此辭舊迎新之際,我要向Microchip的全體員工、客戶
    的頭像 發(fā)表于 12-27 13:55 ?1400次閱讀

    AD9548/PCBZ評(píng)估板的電源適配器是多少V和多少A的?

    我想問(wèn)一下AD9548/PCBZ評(píng)估板的電源適配器是多少V和多少A的,因?yàn)榍岸螘r(shí)間我的電源適配器不見(jiàn)了
    發(fā)表于 11-15 07:27

    #共建FPGA開(kāi)發(fā)者技術(shù)社區(qū),為FPGA生態(tài)點(diǎn)贊#

    今天玩玩紫光的riscv軟核,遇見(jiàn)了編碼問(wèn)題導(dǎo)致的串口打印亂碼,哈哈哈
    發(fā)表于 11-08 14:06

    STemWin怎么使用大號(hào)字體?

    STemWin 怎么使用大號(hào)字體, 看代碼 GUI_SetDefaultFont 是 6x8 的字體,可是修改字體,那一堆宏,只有 6x8 有用,其他的宏都不管用。 怎么樣使用大一號(hào)的字體,這個(gè)字體太小太小了,正點(diǎn)原子 4.3 寸屏,6x8字體幾乎都看不見(jiàn)了。
    發(fā)表于 11-01 07:19

    求助,關(guān)于MDK字體切換問(wèn)題

    MDK5.23,將C/C++的字體由系統(tǒng)默認(rèn)的Courier New切換為Consolas字體,想再切換回去的時(shí)候,發(fā)現(xiàn)Courier New字體選項(xiàng)居然不見(jiàn)了??百思不得其解,這難道還有什么特殊的地方??求助?。?
    發(fā)表于 10-25 07:10