Casbin访问控制框架入门详解及Java案例示范

Casbin访问控制框架入门详解及Java案例示范Casbin 是一个强大的 高效的开源访问控制框架 其权限管理机制支持多种访问控制模型 Casbin 可以 默认的请求格式为 subject object action 2 具有访问控制模型 model 和策略 policy 两个核心概念 3 支持 RBAC 中的多层角色继承 不止主体可以有角色 资源也可以具有角色 4 支持内置的超级用户例如 root 或 administrato 超级用户可以执行任何操作而无需显式的权限声明

1、Casbin基本介绍

Casbin 可以:

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

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

  • 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模型

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、项目结构

Casbin访问控制框架入门详解及Java案例示范

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、运行结果

在这里插入图片描述

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/206997.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月19日 下午2:41
下一篇 2026年3月19日 下午2:41


相关推荐

  • 科大讯飞正式发布基于全国产算力训练的星火X2大模型

    科大讯飞正式发布基于全国产算力训练的星火X2大模型

    2026年3月14日
    2
  • apache 虚拟主机如何配置[通俗易懂]

    apache 虚拟主机如何配置[通俗易懂]apache虚拟主机如何配置?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。apache虚拟主机就是在apache服务器上配置多个虚拟主机,从而让一个服务器提供多站点的服务实现。通俗来说,就是对同一个服务器上的不同目录进行访问。Apache基于名字的虚拟主机设置这种方式,各个虚拟主机共享同一份Apache,因此有CGI程序运行时,安全性也不高。设置这种虚拟主机时,只要为每一个虚拟主机设置类似如下的信息即可,NameV…

    2025年11月18日
    5
  • 极影动漫_风车动漫无删减免费下载

    极影动漫_风车动漫无删减免费下载极影动漫链接:http://vod.ktxp.com…

    2022年8月23日
    5
  • opencv之Canny()函数

    opencv之Canny()函数概述Canny()函数可以使用canny算法对输入图像进行边缘检测。API说明C++API:voidcv::Canny(InputArrayimage,(输入图像:8-bit)OutputArrayedges,(输出边缘图像:单通道,8-bit,size与输入图像一致)double…

    2022年5月7日
    51
  • C# Winform 窗体美化(目录)

    C# Winform 窗体美化(目录)最近在看C#Winform的窗体美化,发现一些很有用的美化皮肤库,学习过后也把一些资料整理一下。一、IrisSkin换肤库(IrisSkin4)二、LayeredSkin界面库(LayeredSkinDemo)三、不规则窗体(GoldFishProject,TransparentForm)四、镂空窗体(HollowForm)五、鼠标穿透(MousePenetration)

    2022年5月28日
    39
  • c语言逻辑运算符!_c语言中关系运算符

    c语言逻辑运算符!_c语言中关系运算符&|~^>><<&&||!运算符包括逻辑运算符与位运算符。逻辑运算符针对的就是真假问题,或者说01问题,也就是bool类型的。位运算符重点在于位操作,也就是对每一位进行操作。下面逐个介绍。&当&两边是bool类型的值时,该运算符作为逻辑运算符。作用如下:当运算符两边的表达式的…

    2026年4月16日
    4

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号