前言
作為一名后臺開發(fā)人員,權(quán)限這個名詞應(yīng)該算是特別熟悉的了。就算是java里的類也有 public、private 等“權(quán)限”之分。之前項(xiàng)目里一直使用shiro作為權(quán)限管理的框架。說實(shí)話,shiro的確挺強(qiáng)大的,但是它也有很多不好的地方。shiro默認(rèn)的登錄地址還是login.jsp,前后端分離模式使用shiro還要重寫好多類;手機(jī)端存儲用戶信息、保持登錄狀態(tài)等等,對shiro來說也是一個難題。
在分布式項(xiàng)目里,比如電商項(xiàng)目,其實(shí)不太需要明確的權(quán)限劃分,說白了,我認(rèn)為沒必要做太麻煩的權(quán)限管理,一切從簡。何況shiro對于springCloud等各種分布式框架來說,簡直就是“災(zāi)難”。每個子系統(tǒng)里都要寫點(diǎn)shiro的東西,慢慢的,越來越惡心。zuul網(wǎng)關(guān)就在這里大顯身手了,控制用戶的登錄,鑒定用戶的權(quán)限等等。zuul網(wǎng)關(guān)控制用戶登錄,鑒權(quán)以后再詳說。以上拙見。
然后最近我發(fā)現(xiàn)了另一個權(quán)限框架jcasbin,雖然網(wǎng)上還沒有很多關(guān)于博客,但是我看了一會就可以使用了。
一、準(zhǔn)備
基于springboot1.5.10,但是和springboot關(guān)系不太大,所以版本可以忽略,用你熟悉的springboot版本就行。
1、mavan倉庫引入
org.casbin jcasbin 1.1.0 org.casbin jdbc-adapter 1.1.0
2、配置文件
jcasbin把用戶的角色、權(quán)限信息(訪問路徑)放置在配置文件里,然后通過輸入流讀取配置文件。主要有兩個配置文件:model.conf 和 policy.csv。簡單的使用GitHub里都講了,在此就不再贅述了。
其實(shí)也可以讀取數(shù)據(jù)庫的角色權(quán)限配置。所以我們可以把關(guān)于數(shù)據(jù)庫的信息提取出來,可以進(jìn)行動態(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ù)制過來放在新建的和src同級的文件夾下即可。policy.csv的內(nèi)容是可以從數(shù)據(jù)庫讀取的。
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)行初始化
我們要對Enforcer這個類初始化,加載配置文件里的信息。所以我們寫一個類實(shí)現(xiàn)InitializingBean,在容器加載的時(shí)候就初始化這個類,方便后續(xù)的使用。
@Component publicclassEnforcerFactoryimplementsInitializingBean{ privatestaticEnforcerenforcer; @Autowired privateEnforcerConfigPropertiesenforcerConfigProperties; privatestaticEnforcerConfigPropertiesconfig; @Override publicvoidafterPropertiesSet()throwsException{ config=enforcerConfigProperties; //從數(shù)據(jù)庫讀取策略 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; } }
在這個類里,我們注入寫好的配置類,然后轉(zhuǎn)為靜態(tài)的,在afterPropertiesSet方法里實(shí)例化Enforcer并加載policy(策略,角色權(quán)限/url對應(yīng)關(guān)系)。
同時(shí)又寫了兩個方法,用來添加和刪除policy,Policy是自定的一個類,對官方使用的集合/數(shù)組進(jìn)行了封裝。
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、權(quán)限控制
jcasbin的權(quán)限控制非常簡單,自定義一個過濾器,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("無權(quá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)這個方法對用戶、訪問資源、方式進(jìn)行匹配。這里的邏輯可以根據(jù)自己的業(yè)務(wù)來實(shí)現(xiàn)。在這個過濾器之前還可以添加一個判斷用戶是否登錄的過濾器。
2、添加刪除權(quán)限
對于權(quán)限的操作,直接調(diào)用上面寫好的EnforcerFactory里對應(yīng)的方法即可。并且,可以達(dá)到同步的效果。就是不用重啟服務(wù)器或者其他任何操作,添加或刪除用戶權(quán)限后,用戶對應(yīng)的訪問就會收到影響。
@PutMapping("/anon/role/per") publicResultBO
寫在后面的話
其實(shí)可以把jcasbin和SpringCloud的zuul結(jié)合來實(shí)現(xiàn)用戶的統(tǒng)一登錄和權(quán)限控制。自定義一個過濾器繼承ZuulFilter即可,其他地方基本沒啥區(qū)別。
-
框架
+關(guān)注
關(guān)注
0文章
404瀏覽量
18425 -
數(shù)據(jù)庫
+關(guān)注
關(guān)注
7文章
4020瀏覽量
68349 -
GitHub
+關(guān)注
關(guān)注
3文章
488瀏覽量
18668
原文標(biāo)題:發(fā)現(xiàn)一款更輕量級的權(quán)限框架,十分鐘就能快速上手,yyds
文章出處:【微信號:AndroidPush,微信公眾號:Android編程精選】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
iMatrix平臺核心功能—權(quán)限管理介紹
一個通用的權(quán)限管理模型的設(shè)計(jì)方案
基于規(guī)則引擎的實(shí)例級權(quán)限控制研究
基于角色的多約束動態(tài)權(quán)限管理模型
詳細(xì)剖析有數(shù)BI的權(quán)限體系!
鴻蒙APP開發(fā)鴻蒙權(quán)限請求框架
如何使用鴻蒙系統(tǒng)上權(quán)限請求框架桃夭
一款好用的鴻蒙系統(tǒng)上的權(quán)限請求框架
erp用戶權(quán)限管理怎么做
基于角色的松耦合式權(quán)限控制設(shè)計(jì)
一個輕量級的權(quán)限認(rèn)證框架:Sa-Token
oracle系統(tǒng)權(quán)限和對象權(quán)限的區(qū)別
鴻蒙開發(fā)Ability Kit程序框架服務(wù):聲明權(quán)限
華納云:設(shè)置RBAC權(quán)限的方法
電能質(zhì)量在線監(jiān)測裝置支持多賬號權(quán)限管理嗎?
權(quán)限框架jcasbin的角色權(quán)限配置
評論