SpringBoot整合Jcasbin,RESTful,Mysql,入门

Casbin 是一个权限框架,这里就不多赘述了,有兴趣自己了解: Casbin,这里我们使用的是JCasbin

  1. 首先需要了解Casbin的Model和Policy,可以通过这里观察编辑器,这里主要是用RESTful
  2. model.conf
    PERM模型:subject(sub 访问实体),object(obj访问的资源)和action(act访问方法)
    Policy:策略
    Effect:影响
    Matchers: 匹配规则 Request和Policy的匹配规则
[request_definition]
r = sub, obj, act

[policy_definition]
p = sub, obj, act

[policy_effect]
e = some(where (p.eft == allow))

[matchers]
m = r.sub == p.sub && keyMatch(r.obj, p.obj) && regexMatch(r.act, p.act)

3.这里采用Mysql作为Policy来源,数据库模型可参考 数据库存储格式

废话不多说,开始上代码
第一步:导入maven

       <!-- Jcasbin -->
       <dependency>
           <groupId>org.casbin</groupId>
           <artifactId>jcasbin</artifactId>
           <version>1.4.0</version>
       </dependency>
       <dependency>
           <groupId>org.casbin</groupId>
           <artifactId>jdbc-adapter</artifactId>
           <version>2.0.0</version>
       </dependency>

第二步:配置JDBCAdapter
先看一步源码,这里有一个坑,读第一列的时候数据库一般是id,而CasbinRule类这里没有id这个字段,就会导致一个转换异常,也是踩了坑才发现,如果你数据库中Policy没有用id而是和CasbinRule对称,那你可以直接使用源码配置,直接注入JDBCAdapter(datasource),不需要采取第二步的配置
在这里插入图片描述

在这里插入图片描述
我这里只实现了加载规则loadPolicy,这是我抄源码进行部分修改,重新实现JDBCAdapter

class CasbinRule {
	String ptype;
	String v0;
	String v1;
	String v2;
	CasbinRule() {
	}
}

public class JcasbinJDBCAdapter implements Adapter {

	private DataSource dataSource;

	public JcasbinJDBCAdapter(DataSource dataSource) throws Exception {
		this.dataSource = null;
		this.dataSource = dataSource;
	}

	private void loadPolicyLine(CasbinRule line, Model model) {
		String lineText = line.ptype;
		if (!line.v0.equals("")) {
			lineText = lineText + ", " + line.v0;
		}

		if (!line.v1.equals("")) {
			lineText = lineText + ", " + line.v1;
		}

		if (!line.v2.equals("")) {
			lineText = lineText + ", " + line.v2;
		}

		Helper.loadPolicyLine(lineText, model);
	}

	public void loadPolicy(Model model) {
		try {
			Connection conn = this.dataSource.getConnection();
			Throwable var3 = null;

			try {
				Statement stmt = conn.createStatement();
				ResultSet rSet = stmt.executeQuery("SELECT * FROM casbin_rule");
				ResultSetMetaData rData = rSet.getMetaData();

				while (rSet.next()) {
					CasbinRule line = new CasbinRule();

					for (int i = 2; i <= rData.getColumnCount(); ++i) {
						if (i == 2) {
							line.ptype = rSet.getObject(i) == null ? "" : (String) rSet.getObject(i);
						}
						else if (i == 3) {
							line.v0 = rSet.getObject(i) == null ? "" : (String) rSet.getObject(i);
						}
						else if (i == 4) {
							line.v1 = rSet.getObject(i) == null ? "" : (String) rSet.getObject(i);
						}
						else if (i == 5) {
							line.v2 = rSet.getObject(i) == null ? "" : (String) rSet.getObject(i);
						}
					}

					this.loadPolicyLine(line, model);
				}

				rSet.close();
			}
			catch (Throwable var17) {
				var3 = var17;
				throw var17;
			}
			finally {
				if (conn != null) {
					if (var3 != null) {
						try {
							conn.close();
						}
						catch (Throwable var16) {
							var3.addSuppressed(var16);
						}
					}
					else {
						conn.close();
					}
				}

			}
		}
		catch (SQLException var19) {
			var19.printStackTrace();
			throw new Error(var19);
		}
	}

	@Override
	public void savePolicy(Model model) {

	}

	@Override
	public void addPolicy(String sec, String ptype, List<String> rule) {

	}

	@Override
	public void removePolicy(String sec, String ptype, List<String> rule) {

	}

	@Override
	public void removeFilteredPolicy(String sec, String ptype, int fieldIndex, String... fieldValues) {

	}

}

第三步:配置Casbin

@Configuration
@Slf4j
public class JcasbinAdapterConfiguration {
	//配置model.conf的绝对路径
	//至于为什么使用采用配置来加载,是因为如果打成jar情况下会读不到相对路径,算是踩过的一个坑
	@Value("${config.model-path:}")
	private String modelPath;

	@Autowired
	private DataSource dataSource;
	
//  这段是呼应上一部分数据库中没有id字段直接与CasbinRule类对称
//	@Bean
//	public JDBCAdapter() throws Exception {
//		return new JDBCAdapter(dataSource);
//	}

	@Bean
	public JcasbinJDBCAdapter jdbcAdapter() throws Exception {
		return new JcasbinJDBCAdapter(dataSource);
	}

	@Bean
	public Enforcer enforcer(JcasbinJDBCAdapter jcasbinJDBCAdapter) throws Exception {
		return new Enforcer(modelPath, jcasbinJDBCAdapter);
	}

}

第四步:使用Casbin

@RestController
@RequestMapping("/")
public class DataarcheDesignBuildingController {
	@Autowired
	private Enforcer enforcer;
	
	@GatMapping("/test1")
	public R test(){
		string authorityId = "888";
		string requestURI= "/a";
		string requestmethod= "GET";
		boolean enforce = enforcer.enforce(authorityId, requestURI, requestmethod);
	}	
	
}

在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值