在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

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

    文章

    403

    瀏覽量

    17483
  • spring
    +關注

    關注

    0

    文章

    340

    瀏覽量

    14343
  • 過濾器
    +關注

    關注

    1

    文章

    429

    瀏覽量

    19612

原文標題:再見了 shiro

文章出處:【微信號:芋道源碼,微信公眾號:芋道源碼】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    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

    使用LMH6401遇見了通頻帶不平坦的問題,怎么解決?

    我在使用TI公司的DVGA LMH6401的時候遇見了通頻帶不平坦的問題。設計電路為三級LMH6401+三級LMH6401,希望實現了80多dB的動態調節范圍,其中遇到了兩個問題,第一個就是通頻帶
    發表于 09-05 06:18

    請問AMC1351是否可以用做交流電壓的檢測?

    AMC1311, AMC1411, AMC1350在這個器件的一些參數說明中我看見了該隔離放大器可用于直流檢測,但我的應用需求是用于交流電壓的檢測,該隔離運放可以幫我達成這個目標嗎?差不多類型的AMC1211、AMC1311、AMC1411是否也能呢,希望能得到您的回復,謝謝。
    發表于 08-02 06:01

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

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

    CYT4BF8CEDQ0AESGS使用IAR9.32進行編譯運行了freertos,jlink仿真后程序會在vPortStartFirstTask 的svc 0卡死的原因?

    我現在在用CYT4BF8CEDQ0AESGS這一款芯片,使用IAR9.32進行編譯,運行了freertos,但是碰見了一個問題,程序在用自己做的串口BootLoader升級是可以正常運行的,但是
    發表于 05-29 07:36

    Nucleo-F401RE下載bin斷電后再上電bin文件丟失的原因?

    斷電后,再上電,發現led不閃了,查看映射到電腦的U盤,里面的bin文件也不見了。用STM32 ST-Link Utility燒寫工具,直接將bin文件燒寫后,也是同樣的情況,請問大神們是有什么地方要配置而疏忽了嗎?
    發表于 04-28 08:04

    MDK5.23將C/C++的字體由系統默認的Courier New切換為Consolas字體,再切換回去Courier New字體選項不見了

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

    ST-Link驅動不見了怎么解決?

    用了很久的ST-Link驅動突然不見了,重新安裝設備管理器里面也沒有,電腦重啟也沒用,到底怎么了,應該怎么辦?[/tr]
    發表于 03-18 06:37

    在STM32F407上使用DMA給TIM2的CCR4寫值,高位出現0x64沒有波形產生怎么處理?

    在STM32F407上使用DMA給TIM2的CCR4寫值,輸出固定個數PWM波個數時,遇見了CCR4的高位與低位同時被寫入相同的值,如圖所示 在DEBUG時可以看見CCR4的高16位與低16位同時被賦值了,但是在內存中,我只存了0x64,為什么會出現高位也出現0x64,導致沒有波形產生。
    發表于 03-11 08:04

    FX3通過USB3.0引導燒錄固件后設備無法識別的原因?怎么解決?

    自己設計的板子中移植了FX3部分的電路,采用USB引導燒錄固件之后,顯示燒錄成功,但原來可以識別的設備消失不見了,有朋友出現過這種情況嘛?無奈通過USB2.0口將固件進行燒錄到EEPROM中(這個
    發表于 02-27 07:50

    CY4500找到不行到驅動的原因?

    你好,我買了 CY4500板子,下載了 EZ-PD 協議分析器實用程序,但是電腦并沒有 checktest到cy4500的驅逐出動。我看見了區上說,最新版本不用了額外下載驅動的。根據在區內看到 winusb.sys,我找到了 winusb.sys 并嘗試了選擇手動更新新驅動,但是還沒有成功。
    發表于 02-23 08:01

    在DAVE?版本中安裝和快速啟動iSYSTEM的winIDEA時出錯怎么解決?

    ;#039;中提到的說明進行操作。 之后,單擊 “配置”,出現以下錯誤,如圖所示。 [第三步之后,第18頁]。 它顯示 “iConnect64.dll” 不見了。 拜托,你能和我分享這個
    發表于 01-18 07:54

    一個簡單的Shiro RCE檢測和利用腳本

    一個簡單的Shiro RCE檢測和利用腳本。
    的頭像 發表于 01-09 09:46 ?646次閱讀

    揮手2023,我們2024再見

    光學儀器儀器儀表
    上海嫦娥光學儀器科技有限公司
    發布于 :2024年01月02日 11:19:35
    主站蜘蛛池模板: 狠狠噜噜| 伊人涩| 久久免费精品高清麻豆| 婷婷综合在线观看丁香| 黄色一级片在线观看| 三级黄网| 欧美一卡2卡三卡4卡5卡免费观看| 天天综合网网欲色| 日韩三级免费观看| 永久手机看片福利盒子| 黄色在线观看网站| 四虎影视网站| 你懂的亚洲| 天天摸天天做天天爽天天弄| 69日本xxxxxxxxx96| 日韩种子| 天天色视频| 日本欧洲亚洲一区在线观看| 欧美四虎| 尻逼久久| 亚洲爱爱网| 51成人网| 性做久久久久| 免费黄色地址| 国内精品免费视频自在线| 亚洲第一色在线| 在线视频 亚洲| 日本在线一区二区| 欧美三级第一页| 女bbbbxxxx毛片视频丶| 亚洲四虎永久在线播放| free欧美| 色噜噜人体337p人体| 六月婷婷精品视频在线观看| 国产午夜爽爽窝窝在线观看| 性色a| 五月深爱婷婷| 中文三级视频| 888米奇色狠狠俺去啦| 日本不卡毛片一二三四| 狠狠色丁香久久综合五月|