casbin访问控制框架入门详解及java案例示范(代码片段)

林小鹿@ 林小鹿@     2022-11-14     748

关键词:

1、Casbin基本介绍

Casbin 是一个强大的、高效的开源访问控制框架,其权限管理机制支持多种访问控制模型。

Casbin 可以:

  • 支持自定义请求的格式,
  • List item

默认的请求格式为subject, object, action。
2. 具有访问控制模型model和策略policy两个核心概念。
3. 支持RBAC中的多层角色继承,不止主体可以有角色,资源也可以具有角色。
4. 支持内置的超级用户 例如:root 或 administrator。超级用户可以执行任何操作而无需显式的权限声明。
5. 支持多种内置的操作符,如 keyMatch,方便对路径式的资源进行管理,如 /foo/bar 可以映射到 /foo*

2、为什么要使用Casbin

使用casbin,在前后端分离中,前端每次只要传一个包含用户的JWT,后端就知道当前访问的API是否有权限。另外,Casbin支持多语言,这样在策略不用改变的情况下,别的语言也可以使用。

3、工作原理

PERM模型

在 Casbin 中, 访问控制模型被抽象为基于 PERM (Policy, Effect, Request, Matcher) 的一个文件,描述了资源与用户之间的关系。

PERM :

  • Policy:策略,定义权限的规则, p = sub, obj, act, eft,策略一般存储到数据库,因为会有很多。
  • Effect:影响,它决定我们是否可以放行。
  • Request: 访问请求, r = sub, obj, act。
  • Matcher: 匹配规则,判断 Request 是否满足 Policy。

Request

一个请求可能长这样: r=sub,obj,act,它实际上定义了我们应该提供访问控制匹配功能的参数名称和顺序。
sub, obj, act, eft含义如下:

  • sub:subject,访问实体;
  • obj: object,访问的资源;
  • act: action,访问方法;
  • eft: effect,策略结果,一般为空,默认指定allow,还可以定义为deny。

4、Module File 语法

Model是Casbin的具体访问模型,其主要以文件的形式出现,该文件常常以.conf最为后缀。

  • Model CONF 至少应包含四个部分: [request_definition], [policy_definition], [policy_effect], [matchers]。
  • 如果 model 使用 RBAC, 还需要添加[role_definition]部分。
  • Model CONF 文件可以包含注释。注释以 # 开头, # 会注释该行剩余部分。

Request定义

[request_definition]
r = sub, obj, act

[request_definition] 部分用于request的定义,它明确了 e.Enforce(…) 函数中参数的含义。sub, obj, act 表示经典三元组: 访问实体 (Subject),访问资源 (Object) 和访问方法 (Action)。

Policy定义

[policy_definition]
p = sub, obj, act

[policy_definition] 部分是对policy的定义,policy部分的每一行称之为一个策略规则, 每条策略规则通常以形如p, p2的policy type开头。

Policy effect定义

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

[policy_definition] 部分是对policy的定义。上面的策略效果表示如果有任何匹配的策略规则 允许, 最终效果是 允许 (aka allow-override). p.eft 是策略的效果,它可以 允许 或 否定。 它是可选的,默认值是 允许。 因为我们没有在上面指定它,所以它使用默认值。

匹配器

[matchers] 是策略匹配程序的定义。匹配程序是表达式。它定义了如何根据请求评估策略规则。

[matchers]
m = r.sub == p.sub && r.obj == p.obj && r.act == p.act

上述匹配器是最简单的,这意味着请求中的主题、对象和行动应该与政策规则中的匹配。

完整model.conf

# Request定义
[request_definition]
r = sub, obj, act

# 策略定义
[policy_definition]
p = sub, obj, act

# 角色定义
[role_definition]
g = _, _

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

# 匹配器定义
[matchers]
m = g(r.sub, p.sub) && r.obj == p.obj && r.act == p.act

5、Casbin模型

ACL模型

我们定义一个策略 p = sub, obj, act,定义一个匹配规则,通过请求过来的参数 r = sub, obj, act与策略通过规则进行匹配,获得一个Effect影响,拿到影响的结果,进入影响的表达式,返回一个布尔值。

run the test,我们可以发现第一行,第二行为true,第三行为false。这是因为在Policy中,我们定义了用户名为alice的这个人有对data1,data2数据的read和write的操作,因此查询结果返回为true。而没有定义其对data2的read操作,因此返回为false。

RBAC模型

  • g = _ , _ 表示用户是哪个角色;
  • g = ,,_ 表示 用户是哪个角色,属于哪个商户。

run the test,我们可以发现第一行,第二行都为true。这是因为alice, data2, read首先通过g(r.sub, p.sub)映射成data2_admin, data2, read,然后data2_admin, data2, read在Policy中去进行查找,发现可以找到这条规则,因此返回为true。这意味着 alice 是角色 data2_admin的一个成员。alice 在这里可以是用户、资源或角色。 Cabin 只是将其识别为一个字符串。

RABC with domains/tenants


run the test,结果为true。这是因为alice, domain1, data1, write 首先通过g(r.sub, p.sub, r.dom)映射成admin, domain1, data1, write,然后再去Policy中去进行查找,发现可以找到这条规则,因此返回为true。

6、Java代码实践(Casbin小案例)

6.1、项目结构

6.2、引入依赖

 <dependencies>
        <dependency>
            <groupId>org.casbin</groupId>
            <artifactId>jcasbin</artifactId>
            <version>1.2.0</version>
        </dependency>
 </dependencies>

6.3、引入model.conf文件

[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 && r.obj == p.obj && r.act == p.act

6.4、引入policy.csv文件

policy.csv文件就相当于一张权限表。

p, zhangsan, data1, read

6.5、引入核心测试代码

import org.casbin.jcasbin.main.Enforcer;

public class MyMain 
    public static void main(String[] args) 
        String resPath = MyMain.class.getResource("/").getPath();
        Enforcer e = new Enforcer(resPath + "model.conf", resPath + "policy.csv");

        String sub = "zhangsan";
        String obj = "data1";
        String act = "read";

        if (e.enforce(sub, obj, act) == true) 
            System.out.println("通过");
         else 
            System.out.println("未通过");
        
    

6.5、运行结果

casbin访问控制框架入门详解及java案例示范(代码片段)

1、Casbin基本介绍Casbin是一个强大的、高效的开源访问控制框架,其权限管理机制支持多种访问控制模型。Casbin可以:支持自定义请求的格式,Listitem默认的请求格式为subject,object,action。2.具有访问控制模型model和策略po... 查看详情

分享《微信小程序开发图解案例教程》pdf及代码+《微信小程序开发入门及案例详解》pdf及代码

...小程序开发图解案例教程》PDF及代码+《微信小程序开发入门及案例详解》PDF及代码《微信小程序开发图解案例教程》PDF,356页,带书签目录;配套源代码。采用图、表与详细说明的示例代码相结合的叙述方式,讲解微信小程序... 查看详情

python应用实战案例-pythongeopandas包详解(附大量案例及代码)(代码片段)

...介绍及应用案例tensorflow从入门到精通100讲 深度学习框架TensorFlow的应用案例手把手教你ML机器学习算法源码全解析 机器学习算法解析及应用案例数据挖掘算法解析指南 数据挖掘算法原理解析及应用案例数据结构常见... 查看详情

python零基础入门:字符串使用详解(常用方法及使用案例)(代码片段)

...页」:士别三日wyx  此文章已录入专栏《Python零基础入门》  人生苦短,我用Python——Lifeisshort,youneedPython字符串详解1、字符串的定义1)单引号字符串2)双引号字符串3)多行字符串4)打印字符串2... 查看详情

springsecurity详解

...是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架。它提供了一组可以在Spring应用上下文中配置的Bean,充分利用了SpringIoC,DI(控制反转InversionofControl,DI:DependencyInjection依赖注入)和AOP(面向... 查看详情

spring框架介绍及使用

Spring框架—控制反转(IOC)1Spring框架概述1.1什么是Spring1.2Spring的优点1.3Spring的体系结构2入门案例:(IoC)2.1导入jar包2.2目标类2.3配置文件2.4测试3入门案例:DI3.1目标类3.2dao3.3service3.4配置文件3.5测试4依赖注入装配Bean基于xml4.1属性... 查看详情

springboot入门及案例

...SpringBoot1.1:SpringBoot简介SpringBoot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程。该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置。1.2:SpringBoot特性 ... 查看详情

java基础|数组及内存分配详解

⭐本专栏旨在对JAVA的基础语法及知识点进行全面且详细的讲解,完成从0到1的java学习,面向零基础及入门的学习者,通过专栏的学习可以熟练掌握JAVA编程,同时为后续的框架学习,进阶开发的代码能力打下坚实的基础。 查看详情

dubbo架构设计及入门案例(代码片段)

框架介绍1.1.1概述Dubbo是阿里巴巴公司开源的一个高性能优秀的服务框架,使得应用可通过高性能的RPC实现服务的输出和输入功能,可以和Spring框架无缝集成。Dubbo是一款高性能、轻量级的开源JavaRPC框架,它提供了三大核心能力... 查看详情

qgis入门实战精品教程3.4:qgis创建连接打包geopackage数据库及数据入库案例详解

GeoPackage(以下简称gpkg),内部使用SQLite实现的一种单文件、与操作系统无关的地理数据库。在QGIS中可以很方便的实现GeoPackage的创建与连接等操作。文章目录一、QGIS创建GeoPackage1.创建数据库2.数据入库二、矢量数据打包为GeoPacka... 查看详情

java基础|switch循环及random详解

⭐本专栏旨在对JAVA的基础语法及知识点进行全面且详细的讲解,完成从0到1的java学习,面向零基础及入门的学习者,通过专栏的学习可以熟练掌握JAVA编程,同时为后续的框架学习,进阶开发的代码能力打下坚实的基础。 查看详情

1.spring框架入门案例

一、简单入门案例入门案例:IoC 1.项目创建与结构 2.接口与实现类User.java接口packagecom.jd.ioc;/***@authorweihu*@date2018/8/8/00822:29*@desc用户接口*/publicinterfaceUser{voidaddUser();}UserImpl.java实现类packagecom.jd.ioc.impl;i 查看详情

springsecurity简介及其入门案例(代码片段)

...是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案 查看详情

初识spring及打印机案例

...础版本只有2MB左右的大小。一:IOC(InversionofControl)即“控制反转”,不是什么技术,而是一种设计思想。在Java开发中,Ioc意味着将你设计好的对象交给 查看详情

qgis入门实战精品教程3.4:qgis创建连接打包geopackage数据库及数据入库案例详解

GeoPackage(以下简称gpkg),内部使用SQLite实现的一种单文件、与操作系统无关的地理数据库。在QGIS中可以很方便的实现GeoPackage的创建与连接等操作。文章目录一、QGIS创建GeoPackage1.创建数据库2.数据入库二、矢量数据打包为GeoPacka... 查看详情

java学习路线是怎样的?

...组拷贝、多维数组、final关键字、构造函数的调用、类的访问权限和路径、面向对象高级特性、Java异常处理、Set,Map,List接口及接口实现类、Java线程、同步阻塞、JavaIO流、文件的操作,复制,读写,删除等。第二阶段,JavaWeb:... 查看详情

java开发需要掌握哪些技术?

...bai拷贝、多维数组、final关键字、构造函数的调用、类的访问权限和路径、面向对象高级特性、Java异常处理、Set,Map,List接口及接口实现类、Java线程、同步阻塞、JavaIO流、文件的操作,复制,读写,删除等。第二阶段,JavaWeb:... 查看详情

第四十三课

webapp server与java技术基础java技术基础及tomcat入门tomcat配置详解tomcat配置及案例 查看详情