日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

一款轻量级的权限框架,轻松搞定项目权限

發(fā)布時間:2023/12/16 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 一款轻量级的权限框架,轻松搞定项目权限 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

點擊關注公眾號:互聯(lián)網(wǎng)架構師,后臺回復?2T獲取2TB學習資源!

上一篇:Alibaba開源內(nèi)網(wǎng)高并發(fā)編程手冊.pdf

前言

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

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

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

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

一、準備

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

1、mavan倉庫引入

<dependency><groupId>org.casbin</groupId><artifactId>jcasbin</artifactId><version>1.1.0</version> </dependency> <dependency><groupId>org.casbin</groupId><artifactId>jdbc-adapter</artifactId><version>1.1.0</version> </dependency>

2、配置文件

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

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

@Configuration @ConfigurationProperties(prefix?=?"org.jcasbin") public?class?EnforcerConfigProperties?{private?String?url;private?String?driverClassName;private?String?username;private?String?password;private?String?modelPath;public?String?getUrl()?{return?url;}public?void?setUrl(String?url)?{this.url?=?url;}public?String?getDriverClassName()?{return?driverClassName;}public?void?setDriverClassName(String?driverClassName)?{this.driverClassName?=?driverClassName;}public?String?getUsername()?{return?username;}public?void?setUsername(String?username)?{this.username?=?username;}public?String?getPassword()?{return?password;}public?void?setPassword(String?password)?{this.password?=?password;}public?String?getModelPath()?{return?modelPath;}public?void?setModelPath(String?modelPath)?{this.modelPath?=?modelPath;}@Overridepublic?String?toString()?{return?"EnforcerConfigProperties?[url="?+?url?+?",?driverClassName="?+?driverClassName?+?",?username="+?username?+?",?password="?+?password?+?",?modelPath="?+?modelPath?+?"]";}}

這樣我們就可以在application.properties里進行相關配置了。model.conf是固定的文件,之間復制過來放在新建的和src同級的文件夾下即可。policy.csv的內(nèi)容是可以從數(shù)據(jù)庫讀取的。

org.jcasbin.url=jdbc:mysql://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這個類初始化,加載配置文件里的信息。所以我們寫一個類實現(xiàn)InitializingBean,在容器加載的時候就初始化這個類,方便后續(xù)的使用。

@Component public?class?EnforcerFactory?implements?InitializingBean?{private?static?Enforcer?enforcer;@Autowiredprivate?EnforcerConfigProperties?enforcerConfigProperties;private?static?EnforcerConfigProperties?config;@Overridepublic?void?afterPropertiesSet()?throws?Exception?{config?=?enforcerConfigProperties;//從數(shù)據(jù)庫讀取策略JDBCAdapter?jdbcAdapter?=?new?JDBCAdapter(config.getDriverClassName(),config.getUrl(),config.getUsername(),config.getPassword(),?true);enforcer?=?new?Enforcer(config.getModelPath(),?jdbcAdapter);enforcer.loadPolicy();//Load?the?policy?from?DB.}/***?添加權限*?@param?policy*?@return*/public?static?boolean?addPolicy(Policy?policy){boolean?addPolicy?=?enforcer.addPolicy(policy.getSub(),policy.getObj(),policy.getAct());enforcer.savePolicy();return?addPolicy;}/***?刪除權限*?@param?policy*?@return*/public?static?boolean?removePolicy(Policy?policy){boolean?removePolicy?=?enforcer.removePolicy(policy.getSub(),policy.getObj(),policy.getAct());enforcer.savePolicy();return?removePolicy;}public?static?Enforcer?getEnforcer(){return?enforcer;}}

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

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

public?class?Policy?{/**想要訪問資源的用戶?或者角色*/private?String?sub;/**將要訪問的資源,可以使用??*?作為通配符,例如/user/*?*/private?String?obj;/**用戶對資源執(zhí)行的操作。HTTP方法,GET、POST、PUT、DELETE等,可以使用?*?作為通配符*/private?String?act;public?Policy()?{super();}/***?*?@param?sub?想要訪問資源的用戶?或者角色*?@param?obj?將要訪問的資源,可以使用??*?作為通配符,例如/user/**?@param?act 用戶對資源執(zhí)行的操作。HTTP方法,GET、POST、PUT、DELETE等,可以使用?*?作為通配符*/public?Policy(String?sub,?String?obj,?String?act)?{super();this.sub?=?sub;this.obj?=?obj;this.act?=?act;}public?String?getSub()?{return?sub;}public?void?setSub(String?sub)?{this.sub?=?sub;}public?String?getObj()?{return?obj;}public?void?setObj(String?obj)?{this.obj?=?obj;}public?String?getAct()?{return?act;}public?void?setAct(String?act)?{this.act?=?act;}@Overridepublic?String?toString()?{return?"Policy?[sub="?+?sub?+?",?obj="?+?obj?+?",?act="?+?act?+?"]";}}

三、使用

1、權限控制

jcasbin的權限控制非常簡單,自定義一個過濾器,if判斷就可以搞定,沒錯,就這么簡單。

@WebFilter(urlPatterns?=?"/*"?,?filterName?=?"JCasbinAuthzFilter") @Order(Ordered.HIGHEST_PRECEDENCE)//執(zhí)行順序,最高級別最先執(zhí)行,int從小到大 public?class?JCasbinAuthzFilter?implements?Filter?{private?static?final?Logger?log?=?LoggerFactory.getLogger(JCasbinAuthzFilter.class);private?static?Enforcer?enforcer;@Overridepublic?void?init(FilterConfig?filterConfig)?throws?ServletException?{}@Overridepublic?void?doFilter(ServletRequest?servletRequest,?ServletResponse?servletResponse,?FilterChain?chain)throws?IOException,?ServletException?{HttpServletRequest?request?=?(HttpServletRequest)?servletRequest;HttpServletResponse?response?=?(HttpServletResponse)?servletResponse;String?user?=?request.getParameter("username");String?path?=?request.getRequestURI();String?method?=?request.getMethod();enforcer?=?EnforcerFactory.getEnforcer();if?(path.contains("anon"))?{chain.doFilter(request,?response);}else?if?(enforcer.enforce(user,?path,?method))?{chain.doFilter(request,?response);}?else?{log.info("無權訪問");Map<String,?Object>?result?=?new?HashMap<String,?Object>();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));}}@Overridepublic?void?destroy()?{}}

主要是用enforcer.enforce(user, path, method)這個方法對用戶、訪問資源、方式進行匹配。這里的邏輯可以根據(jù)自己的業(yè)務來實現(xiàn)。在這個過濾器之前還可以添加一個判斷用戶是否登錄的過濾器。

2、添加刪除權限

對于權限的操作,直接調(diào)用上面寫好的EnforcerFactory里對應的方法即可。并且,可以達到同步的效果。就是不用重啟服務器或者其他任何操作,添加或刪除用戶權限后,用戶對應的訪問就會收到影響。

@PutMapping("/anon/role/per")public?ResultBO<Object>?addPer(){EnforcerFactory.addPolicy(new?Policy("alice",?"/user/list",?"*"));return?ResultTool.success();}@DeleteMapping("/anon/role/per")public?ResultBO<Object>?deletePer(){EnforcerFactory.removePolicy(new?Policy("alice",?"/user/list",?"*"));return?ResultTool.success();}

寫在后面的話

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

來源:blog.csdn.net/WayneLee0809/article/details/85702551

End-

最后,關注公眾號互聯(lián)網(wǎng)架構師,在后臺回復:2T,可以獲取我整理的 Java 系列面試題和答案,非常齊全。

正文結(jié)束

推薦閱讀 ↓↓↓

1.求求你別在用SpringMVC了,太Low了!Spring又官宣了一個更牛逼的替代框架!

2.從零開始搭建創(chuàng)業(yè)公司后臺技術棧

3.程序員一般可以從什么平臺接私活?

4.Spring Boot+Redis+攔截器+自定義Annotation實現(xiàn)接口自動冪等

5.為什么國內(nèi) 996 干不過國外的 955呢?

6.中國的鐵路訂票系統(tǒng)在世界上屬于什么水平?? ? ? ? ? ? ? ? ? ? ? ??

7.15張圖看懂瞎忙和高效的區(qū)別!

總結(jié)

以上是生活随笔為你收集整理的一款轻量级的权限框架,轻松搞定项目权限的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 伊人天堂在线 | 日韩黄色成人 | china国模大尺度pics | 亚洲综合在线五月 | 亚洲欧美另类自拍 | www.超碰97.com | 天天操天天弄 | 国产女人高潮视频 | 69福利网| 国产福利视频网站 | 极品91尤物被啪到呻吟喷水 | 一进一出好爽视频 | 开心激情站 | 日本不卡视频 | av网站国产 | 国模无码国产精品视频 | 致命弯道8在线观看免费高清完整 | 伊人夜色 | 老司机精品福利导航 | 日韩精品一线二线三线 | 欧美男女交配视频 | 亚洲网站在线观看 | 视频一区二区三 | 国产精成人品 | 国产激情一区二区三区视频免樱桃 | 96精品视频 | 国产精品午夜电影 | 亚洲不卡在线播放 | 久久精彩免费视频 | 猛男被粗大男男1069 | 综合久久综合久久 | 黄色大全在线观看 | 欧美精品手机在线 | 中文字幕日韩专区 | 亚洲v国产v | 亚洲男女激情 | 久久国产精品久久国产精品 | 国模二区 | 国语对白做受按摩的注意事项 | 免费观看日韩毛片 | 潘金莲裸体一级淫片视频 | 国产做爰高潮呻吟视频 | 日韩乱码人妻无码系列中文字幕 | 性色欲网站人妻丰满中文久久不卡 | 一区二区三区四区av | 一区视频在线免费观看 | 亚一区二区 | 激情啪啪网 | aa视频免费观看 | 少妇被狂c下部羞羞漫画 | 日韩欧美亚洲在线 | 亚洲网站免费看 | 99热热 | 久久成人免费网站 | 欧美精品一级二级 | 亚洲午夜精品久久久久久人妖 | 午夜xx | 国产精品果冻传媒潘 | 国产精品波多野结衣 | 日韩一级生活片 | 秘密基地免费观看完整版中文 | 在线不欧美 | 男女做爰猛烈吃奶啪啪喷水网站 | 免费国偷自产拍精品视频 | 99免费在线视频 | 亚洲男人第一av | 美女性高潮视频 | 亚洲欧洲另类 | 98色| 国产午夜大片 | 日韩免费片 | 欧美久操 | 黄色应用在线观看 | 草草久久久 | 18禁裸乳无遮挡啪啪无码免费 | 欧美二三区 | 亚洲成人777 | 在线视频免费观看你懂的 | 国产传媒一区二区三区 | 日日操日日干 | 欧美性受xxx黑人xyx性爽 | 香蕉视频黄色 | www.日本色 | 人妻无码中文字幕免费视频蜜桃 | 国产精品精品软件视频 | 日本一区二区免费高清视频 | 双性懵懂美人被强制调教 | 最近免费中文字幕大全免费版视频 | 欧美brazzers| 91久久久久久久久久 | 国产99久久久欧美黑人 | 欧美少妇一区二区三区 | 在线播放成人av | 日韩精品一区二区在线播放 | 久久精品国产一区二区电影 | 免费看黄色三级三级 | 美女一区二区三区四区 | 伊人久久五月天 | 亚洲自拍偷拍区 |