最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

springboot整合jcasbin權(quán)限管理

 更新時(shí)間:2023年09月27日 09:38:26   作者:紅藕香殘玉簟秋  
jcasbin的權(quán)限控制非常簡(jiǎn)單,本文就來(lái)介紹一下springboot整合jcasbin權(quán)限管理,具有一定的參考價(jià)值,感興趣的可以了解一下

前言

作為一名后臺(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還要重寫(xiě)好多類;手機(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)里都要寫(xiě)點(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

一、準(zhǔn)備

基于springboot1.5.10,但是和springboot關(guān)系不太大。

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

? ? ? ?<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把用戶的角色、權(quán)限信息(訪問(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")
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;
	}
	@Override
	public String toString() {
		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: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

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

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

@Component
public class EnforcerFactory implements InitializingBean {
	private static Enforcer enforcer;
	@Autowired
	private EnforcerConfigProperties enforcerConfigProperties;
	private static EnforcerConfigProperties config;
	@Override
	public void afterPropertiesSet() throws Exception {
		config = enforcerConfigProperties;
		//從數(shù)據(jù)庫(kù)讀取策略
		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.
	}
	/**
	 * 添加權(quán)限
	 * @param policy
	 * @return
	 */
	public static boolean addPolicy(Policy policy){
		boolean addPolicy = enforcer.addPolicy(policy.getSub(),policy.getObj(),policy.getAct());
		enforcer.savePolicy();
		return addPolicy;
	}
	/**
	 * 刪除權(quán)限
	 * @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;
	}
}

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

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

public class Policy {
	/**想要訪問(wèn)資源的用戶 或者角色*/
	private String sub;
	/**將要訪問(wèn)的資源,可以使用  * 作為通配符,例如/user/* */
	private String obj;
	/**用戶對(duì)資源執(zhí)行的操作。HTTP方法,GET、POST、PUT、DELETE等,可以使用 * 作為通配符*/
	private String act;
	public Policy() {
		super();
	}
	/**
	 * 
	 * @param sub 想要訪問(wèn)資源的用戶 或者角色
	 * @param obj 將要訪問(wèn)的資源,可以使用  * 作為通配符,例如/user/*
	 * @param act 用戶對(duì)資源執(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;
	}
	@Override
	public String toString() {
		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從小到大
public class JCasbinAuthzFilter implements Filter {
	private static final Logger log = LoggerFactory.getLogger(JCasbinAuthzFilter.class);
	private static Enforcer enforcer;
	@Override
	public void init(FilterConfig filterConfig) throws ServletException {
	}
	@Override
	public 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("無(wú)權(quán)訪問(wèn)");
			Map<String, Object> result = new HashMap<String, Object>();
            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
	public void destroy() {
	}
}

主要是用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)用上面寫(xiě)好的EnforcerFactory里對(duì)應(yīng)的方法即可。并且,可以達(dá)到同步的效果。就是不用重啟服務(wù)器或者其他任何操作,添加或刪除用戶權(quán)限后,用戶對(duì)應(yīng)的訪問(wèn)就會(huì)收到影響。

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

寫(xiě)在后面的話

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

到此這篇關(guān)于springboot整合jcasbin權(quán)限管理的文章就介紹到這了,更多相關(guān)springboot jcasbin權(quán)限內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java函數(shù)式編程(三):列表的轉(zhuǎn)化

    Java函數(shù)式編程(三):列表的轉(zhuǎn)化

    這篇文章主要介紹了Java函數(shù)式編程(二):列表的轉(zhuǎn)化,lambda表達(dá)式不僅能幫助我們遍歷集合,并且可以進(jìn)行集合的轉(zhuǎn)化,需要的朋友可以參考下
    2014-09-09
  • SpringBoot集成Knife4j報(bào)錯(cuò):文件上傳不顯示文件域問(wèn)題的解決方案

    SpringBoot集成Knife4j報(bào)錯(cuò):文件上傳不顯示文件域問(wèn)題的解決方案

    在使用 Knife4j 為 Spring Boot 項(xiàng)目生成 API 文檔時(shí),開(kāi)發(fā)者可能會(huì)遇到文件上傳功能不顯示文件域的問(wèn)題,本文將詳細(xì)介紹如何解決這一問(wèn)題,并提供完整的解決方案,需要的朋友可以參考下
    2025-05-05
  • Vue.Js及Java實(shí)現(xiàn)文件分片上傳代碼實(shí)例

    Vue.Js及Java實(shí)現(xiàn)文件分片上傳代碼實(shí)例

    這篇文章主要介紹了Vue.Js及Java實(shí)現(xiàn)文件分片上傳代碼實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-06-06
  • Java Collections集合繼承結(jié)構(gòu)圖_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

    Java Collections集合繼承結(jié)構(gòu)圖_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

    這篇文章主要介紹了Java Collections集合繼承結(jié)構(gòu)圖_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理,需要的朋友可以參考下
    2017-04-04
  • java環(huán)境變量path和classpath的配置

    java環(huán)境變量path和classpath的配置

    這篇文章主要為大家詳細(xì)介紹了java系統(tǒng)環(huán)境變量path和classpath的配置過(guò)程,感興趣的小伙伴們可以參考一下
    2016-07-07
  • Java中Base64加密解密舉例詳解

    Java中Base64加密解密舉例詳解

    Base64編碼是我們程序開(kāi)發(fā)中經(jīng)常使用到的編碼方法,它是一種基于用64個(gè)可打印字符來(lái)表示二進(jìn)制數(shù)據(jù)的表示方法,這篇文章主要給大家介紹了關(guān)于Java中Base64加密解密的相關(guān)資料,需要的朋友可以參考下
    2024-05-05
  • springboot 1.5.2 集成kafka的簡(jiǎn)單例子

    springboot 1.5.2 集成kafka的簡(jiǎn)單例子

    本篇文章主要介紹了springboot 1.5.2 集成kafka的簡(jiǎn)單例子 ,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-11-11
  • Java編程基礎(chǔ)元素-運(yùn)算符

    Java編程基礎(chǔ)元素-運(yùn)算符

    這篇文章主要介紹了Java編程基礎(chǔ)元素-運(yùn)算符,運(yùn)算符就是在用變量或常量進(jìn)行運(yùn)算時(shí),經(jīng)常需要用到的運(yùn)算符,Java?提供了豐富的運(yùn)算符,可分為算術(shù)運(yùn)算符、關(guān)系運(yùn)算符、邏輯運(yùn)算符和位運(yùn)算符,下面來(lái)看具體的內(nèi)容介紹吧
    2022-01-01
  • Java Reactor反應(yīng)器模式使用方法詳解

    Java Reactor反應(yīng)器模式使用方法詳解

    這篇文章主要介紹了Java Reactor反應(yīng)器模式使用方法詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-06-06
  • 使用JWT創(chuàng)建解析令牌及RSA非對(duì)稱加密詳解

    使用JWT創(chuàng)建解析令牌及RSA非對(duì)稱加密詳解

    這篇文章主要介紹了JWT創(chuàng)建解析令牌及RSA非對(duì)稱加密詳解,JWT是JSON Web Token的縮寫(xiě),即JSON Web令牌,是一種自包含令牌,一種情況是webapi,類似之前的阿里云播放憑證的功能,另一種情況是多web服務(wù)器下實(shí)現(xiàn)無(wú)狀態(tài)分布式身份驗(yàn)證,需要的朋友可以參考下
    2023-11-11

最新評(píng)論

许昌县| 湾仔区| 华坪县| 长岭县| 苏尼特右旗| 牟定县| 金门县| 武城县| 乃东县| 博乐市| 杭锦后旗| 黄梅县| 泾源县| 江山市| 绥中县| 桂林市| 威信县| 郸城县| 吴川市| 洪湖市| 逊克县| 固阳县| 香格里拉县| 遵义市| 金湖县| 秦安县| 安多县| 莱芜市| 如东县| 清涧县| 班玛县| 广南县| 杭锦后旗| 精河县| 辉县市| 泸州市| 枝江市| 靖江市| 阿拉尔市| 宜阳县| 凤城市|