前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >工具系列 | Casbin在PHP中的使用教程

工具系列 | Casbin在PHP中的使用教程

作者头像
Tinywan
发布2023-03-08 19:59:51
1.5K0
发布2023-03-08 19:59:51
举报
文章被收录于专栏:开源技术小栈开源技术小栈

概述

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

Casbin支持以下编程语言:

特性

Casbin 做了什么:
  1. 自定义请求的格式,默认的请求格式为{subject, object, action}
  2. 访问控制模型及其策略的存储。
  3. 支持RBAC中的多层角色继承,不止主体可以有角色,资源也可以具有角色。
  4. 支持超级用户,如 rootAdministrator,超级用户可以不受授权策略的约束访问任意资源。
  5. 支持多种内置的操作符,如 keyMatch,方便对路径式的资源进行管理,如 /foo/bar 可以映射到 /foo*
Casbin 不做的事情:
  1. 身份认证 authentication(即验证用户的用户名、密码),casbin只负责访问控制。应该有其他专门的组件负责身份认证,然后由casbin进行访问控制,二者是相互配合的关系。
  2. 管理用户列表或角色列表。Casbin 认为由项目自身来管理用户、角色列表更为合适, 用户通常有他们的密码,但是 Casbin的设计思想并不是把它作为一个存储密码的容器。而是存储RBAC方案中用户和角色之间的映射关系。

工作原理

在 Casbin 中, 访问控制模型被抽象为基于**PERM (Policy, Effect, Request, Matcher)**的一个文件。因此,切换或升级项目的授权机制与修改配置一样简单。

您可以通过组合可用的模型来定制您自己的访问控制模型。例如,您可以在一个model中获得RBAC角色和ABAC属性,并共享一组policy规则。

Casbin中最基本、最简单的model是ACL。ACL中的ModelCONF为:

代码语言:javascript
复制
# Request definition
[request_definition]
r = sub, obj, act

# Policy definition
[policy_definition]
p = sub, obj, act

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

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

ACLModel的示例Policy如下:

代码语言:javascript
复制
p, alice, data1, read
p, bob, data2, write

这表示:

  • alice 对 data1 有读权限
  • bob 对 data2 有写权限

对于过长的单行配置,您也可以通过在结尾处添加“\”进行断行:

代码语言:javascript
复制
# Matchers
[matchers]
m = r.sub == p.sub && r.obj == p.obj  && r.act == p.act

此外,对于 ABAC,您在可以在 Casbin golang 和 php 版本中尝试下面的 (jCasbin 和 Node-Casbin 尚不支持)操作:

代码语言:javascript
复制
# Matchers
[matchers]
m = r.obj == p.obj && r.act == p.act || r.obj in ('data2', 'data3')

快速开始

Casbin 中最核心的三个概念:Model,Policy,Enforcer

  • Model就是一个CONF文件,基于PERM metamodel (Policy, Effect, Request, Matchers)。
  • Policy是动态存储policy rules的,可以存在.csv文件或数据库中。
  • Enforcer决定一个"subject"对一个"object"是否有"action"的权限。
安装

通过composer安装:

代码语言:javascript
复制
composer require casbin/casbin
配置

创建model.confpolicy.csv文件:

model.conf配置

代码语言:javascript
复制
[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

policy.csv配置

代码语言:javascript
复制
p, alice, data1, read
p, bob, data2, write

创建一个Casbin决策器需要有一个模型文件和策略文件为参数:

代码语言:javascript
复制
require_once './vendor/autoload.php';

use Casbin\Enforcer;

$e = new Enforcer("path/to/model.conf", "path/to/policy.csv");

在需要进行访问控制的位置,通过以下代码进行权限验证:

代码语言:javascript
复制
$sub = "alice"; // the user that wants to access a resource.
$obj = "data1"; // the resource that is going to be accessed.
$act = "read"; // the operation that the user performs on the resource.

if ($e->enforce($sub, $obj, $act) === true) {
    // 允许 alice 读取 data1
} else {
    // 拒绝请求, 显示错误
}
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2021-02-27,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 开源技术小栈 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 概述
  • Casbin支持以下编程语言:
  • 特性
    • Casbin 做了什么:
      • Casbin 不做的事情:
      • 工作原理
      • 快速开始
        • 安装
          • 配置
          相关产品与服务
          文件存储
          文件存储(Cloud File Storage,CFS)为您提供安全可靠、可扩展的共享文件存储服务。文件存储可与腾讯云服务器、容器服务、批量计算等服务搭配使用,为多个计算节点提供容量和性能可弹性扩展的高性能共享存储。腾讯云文件存储的管理界面简单、易使用,可实现对现有应用的无缝集成;按实际用量付费,为您节约成本,简化 IT 运维工作。
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档