SpringBoot整合Jcasbin,RESTful,Mysql,入门

2023-05-16

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

在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SpringBoot整合Jcasbin,RESTful,Mysql,入门 的相关文章

  • 尝试通过 JDBC 将 UTF-8 插入 MySQL 时出现“错误的字符串值”?

    这就是我的连接设置方式 Connection conn DriverManager getConnection url dbName useUnicode true characterEncoding utf 8 userName pass
  • 如何从 mysqldump 中删除表

    如何删除 mysqldump 中包含大量表的一个大表的输出 我有一个 6 GB 大的数据库转储 但其中 90 只是一个日志记录表 cache entries 我的备份中不再需要它 如何轻松删除转储中描述大型日志记录表的部分 我找到了这个 h
  • PHP mysql 选择连接

    我有这个功能 以某种形式显示自动建议 function searchbyId params input strtolower params input len strlen input limit isset params limit in
  • 在 PHP / MySQL 中处理未读帖子

    对于个人项目 我需要使用 PHP 和 MySQL 构建一个论坛 我不可能使用已经构建的论坛包 例如phpBB 我目前正在研究构建此类应用程序所需的逻辑 但这已经是漫长的一天了 我正在努力解决为用户处理未读帖子的概念 我的一个解决方案是有一个
  • org.powermock.reflect.internal.WhiteboxImpl 对方法 java.lang.Object.clone() 的非法反射访问

    我想使用这个 JUnit 测试来测试私有方法 RunWith SpringRunner class SpringBootTest classes ReportingProcessor class public class Reporting
  • Zuul不转发请求到其他微服务

    我正在使用 Spring Boot 微服务 我已经配置了 eureka zuul 代理和另一个微服务 帐户 如果我直接从帐户拨打电话 则工作正常 帐户和 zuul 服务器都显示在 eureka 上 当我尝试使用 zuul 代理进行访问时 它
  • Spring Boot 删除 Whitelabel 错误页面

    我正在尝试删除白色标签错误页面 所以我所做的是为 error 创建了一个控制器映射 RestController public class IndexController RequestMapping value error public
  • 最佳实践:在 PHP 中导入 mySQL 文件;分割查询

    我遇到了一种情况 我必须更新共享托管提供商上的网站 该网站有一个 CMS 使用 FTP 上传 CMS 文件非常简单 我还必须导入一个大的 相对于 PHP 脚本的范围 数据库文件 未压缩时大约 2 3 MB Mysql 已关闭 无法从外部访问
  • Laravel 5:如何检索并显示属于特定类别的所有帖子

    我有3张桌子 user id username subreddits id name created at posts id title link user id subreddit id 问题是 我手动获取 subreddit 类别的 i
  • 备份MySQL数据库

    我有一个大约 1 7GB 的 MySQL 数据库 我通常使用 mysqldump 进行备份 这大约需要 2 分钟 但是 我想知道以下问题的答案 mysqldump 是否阻止对数据库的读取和 或写入操作 因为在实际场景中 我不想在备份数据库时
  • 使用 Spring Boot 进行 Kafka 流

    我想在我的 Spring Boot 项目中使用 Kafka Streams 实时处理 所以我需要 Kafka Streams 配置或者我想使用 KStreams 或 KTable 但我在互联网上找不到示例 我做了生产者和消费者 现在我想实时
  • 使用 Coldfusion 分页

    是否可以仅使用一个查询在 Coldfusion 中分页并显示页数 我的理解是 您显然可以使用一个查询进行分页 但您需要一个额外的查询来创建页面 这是为了计算结果总数 currentPage 1 resultsPerPage Offset i
  • 将数据从 javascript 发送到 mysql 数据库

    我有这个小点击计数器 我想将每次点击都包含在 mysql 表中 有人可以帮忙吗 var count1 0 function countClicks1 count1 count1 1 document getElementById p1 in
  • Hibernate、MySQL 视图和 hibernate.hbm2ddl.auto = 验证

    我可以在 Hibernate 中使用 MySQL 视图 将它们视为表 即 该实体与为表创建的实体没有什么不同 但是 当 Hibernate 设置为验证模型时 我的应用程序将不会部署 因为它找不到视图 因为它假设它是一个表 是否可以在启用部署
  • sqlalchemy 中的随机 ID(pylon)

    我正在使用 pylons 和 sqlalchemy 我想知道如何将一些随机 id 作为primary key 最好的方法是使用随机生成的 UUID import uuid id uuid uuid4 uuid 数据类型在某些数据库中本机可用
  • REPLACE MYSql 中的新行字符不起作用

    我执行了以下查询 由于某种原因它没有替换数据库中的换行符 它说 Rows matches 1 但没有变化 有什么问题吗 mysql gt UPDATE aboutme SET abouttext REPLACE abouttext n WH
  • mysql - 有什么方法可以帮助使用另一个索引进行全文搜索?

    假设我有一个 文章 表 其中包含以下列 article text fulltext indexed author id indexed 现在我想搜索特定作者撰写的文章中出现的术语 所以像这样 select from articles whe
  • MySQL 性能 DELETE 或 UPDATE?

    我有一个超过 10 7 行的 MyISAM 表 向其中添加数据时 我必须在最后更新 10 行 删除它们然后插入新行更快 还是更新这些行更快 应更新的数据不是索引的一部分 索引 数据碎片怎么样 UPDATE到目前为止要快得多 当你UPDATE
  • 混合参数策略 - 仅使用命名策略、位置策略或 JPA 序数策略之一

    我正在从 Oracle 数据库调用函数并面临以下异常 org hibernate engine query ParameterRecognitionException 混合参数策略 仅使用命名 位置或 JPA 序数策略之一 这是我的用户 j
  • 在SPRING BOOT中配置多个数据库

    我正在尝试为我的 Spring Boot 应用程序连接 2 个不同的数据库 但出现此错误 应用程序无法启动 描述 com SyncFibertToolSpring SyncFibertTool MydbDB Config MydbDbCon

随机推荐

  • 黎曼几何与黎曼流形

    目录 0 黎曼几何 1 欧几里得几何与黎曼几何的区别 2 黎曼流形 3 黎曼距离 4 切空间 5 黎曼均值 6 SPD矩阵如何形成黎曼流型 7 切线空间映射 8 同余变换和同余不变 9 黎曼对齐 科普性笔记 xff0c 做了解 xff0c
  • Faster R-CNN

    1 论文简介 论文名 xff1a Faster R CNN Towards Real Time Object Detection with Region Proposal Networks 论文地址 xff1a Faster R CNN 论
  • 手把手教你安装VSCode(附带图解步骤)

    一 前端工具vscode 1 1 概述 前端开发是创建Web页面或app等前端界面呈现给用户的过程 xff0c 通过HTML xff0c CSS及JavaScript以及衍生出来的各种技术 框架 解决方案 xff0c 来实现互联网产品的用户
  • 前端小知识:1.A标签的用法

    前端小知识 1 A标签的用法 Hello xff0c 大家好 xff0c 我是仲桉君 因为一些不可抗因素停更了很久 xff0c 但是我还是回来了从今天开始正式开始更新 这个系列是有关一些前端的小知识的小博文 预计更新20篇以上 争取做到每日
  • 从uboot中学习C语言基本功(uboot/lib_generic/vsprintf.c/simple_strtoul)

    此函数有以下几点值得注意 xff1a 1 第一个参数中的const 一般在函数的形参中 xff0c 如果我们只是希望调用者使用该参数 xff0c 而不会去改变该 参数内容 xff08 一般是指针指向的内容 xff09 xff0c 则可以声明
  • C++语法基础

    C 43 43 环境安装和基础知识 1 xff1a C 43 43 环境安装与配置 我使用的编译器是Clion xff0c 解释器配置的是Dev C 43 43 自带的解释器 xff0c Clion安装见下文 Clion的安装和配置 xff
  • Samba服务

    目录 配置yum源 安装samba服务 配置samba服务 Windows环境使用Samba服务 Linux环境使用Samba服务 xff08 1 xff09 方法一使用smbclient命令 xff08 2 xff09 方法二使用挂载的方
  • 已解决—The connection to the server localhost:8080 was refused - did you specify the right host or port

    运行 kubectl get namespace时报错 xff1a root 64 ip 10 0 0 8 kubectl get namespace E0320 07 39 20 866425 32422 memcache go 265
  • 修改ideal中java项目jdk版本,记得收藏

    1 Ctrl 43 Shfit 43 Alt 43 S 进入Settings 窗口 xff0c 修改红框标记的两处jdk版本 2 Ctrl 43 Shfit 43 Alt 43 S 进入Project Structure窗口 xff0c 先
  • GO语言开发环境配置(Linux)

    Go语言开发环境配置 xff08 Linux xff09 一 Go安装二 IDE安装三 Vim IDE 常用功能 一 Go安装 Go 有多种安装方式 xff0c 比如 Go 源码安装 Go 标准包安装 第三方工具 xff08 yum apt
  • HBase过滤器

    目录 一 介绍 1 hbase运算符 2 Hbase 过滤器的比较器 二 代码 1 hbase建表 2 创建数据 3 导入依赖 4 列值过滤器 5 单列值过滤器 6 单列值排除过滤器 7 rowkey过滤器 8 rowkey前缀过滤器 xf
  • Hive与HBase之间的区别和联系

    目录 概念 Hive HBase 共同点 区别 关系 首先要知道Hive和HBase两者的区别 xff0c 我们必须要知道两者的作用和在大数据中扮演的角色 概念 Hive 1 Hive是hadoop数据仓库管理工具 xff0c 严格来说 x
  • VSCode(Visual Studio Code )软件(插件)安装与使用

    VSCode 简介 Visual Studio Code 简称 VS Code VSC 是微软公司推出的一款免费开源的现代化轻量级代码编辑器 xff0c 支持几乎所有主流的开发语言的语法高亮 智能代码补全 GIT 等特性 xff0c 支持插
  • 51单片机智能小车

    最近学校举办了一个智能小车比赛 xff0c 比赛内容为用手机蓝牙控制小车拥有5个功能 xff0c 分别是超声波舵机避障 xff0c 测距 xff08 显示在LCD1602上 xff09 xff0c 红外跟随 xff0c 循迹还有蓝牙控制小车
  • 在Matlab中通过mex使用cuda的方法

    仅供参考 xff0c 具体问题需要具体分析 xff01 1 cuda安装及配置 xff0c 参考下面这篇 cpp文件调用cuda函数 苹果挨炮的博客 CSDN博客 2 Matlab配置mex编译环境 在matlab命令行中输入以下命令 me
  • container_of 详解

    container of宏的功能 xff1a 从结构体类型 type 的一个成员 member 指针 ptr xff0c 反推得到该结构体的指针 其实现由两个分号隔开的语句组成 xff0c 首先用typeof关键字 xff0c 得到memb
  • ubuntu 内存清理【亲测有效】

    目录 一 xff1a 引言 二 xff1a ubuntu 内存清理 应急 1 移除掉不再需要的软件包 2 清理ubuntu中的APT缓存 3 清理缩略图缓存 4 手动删除老旧Linux内核 5 删除多余的孤立包 6 卸载不必要的应用程序 一
  • hdfs的常见语句

    开hdfs环境 xff1a xff08 开启成功后用jps命令出来至少6条数据 xff09 start all sh 关hdfs环境 xff08 记得关 xff0c 容易坏 xff09 xff1a stop all sh 上传文件 xff1
  • 疑难杂症之vscode--During startup program exited with code 0xc0000139.--缺失重要文件(杂记)

    问题展示 在vscode中 xff0c 只要用了STL容器 xff0c 就会出现这样的提示 发现自己的 vscode 不能运行带有部分 stl 库的程序 xff0c 编译不会报错 xff0c 运行也不会报错但是也没有结果 xff0c 调试的
  • SpringBoot整合Jcasbin,RESTful,Mysql,入门

    Casbin 是一个权限框架 xff0c 这里就不多赘述了 xff0c 有兴趣自己了解 Casbin xff0c 这里我们使用的是JCasbin 首先需要了解Casbin的Model和Policy xff0c 可以通过这里观察编辑器 xff