PHP 中基于 Casbin 做 RBAC + RESTful 权限控制

PHP-Casbin 是一个强大的、高效的开源访问控制框架,它支持基于各种访问控制模型(RBAC ABAC ACL)的权限管理。

这里使用官方提供的数据库适配器扩展:DBAL Adapter.

安装

通过composer安装:

composer require casbin/casbin
composer require casbin/dbal-adapter

使用 RBAC Model

model.conf 如下:

[request_definition]
r = sub, obj, act

[policy_definition]
p = sub, obj, act

#  RBAC角色继承关系的定义
[role_definition]
g = _, _

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

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

初始化一个Casbin enforcer

use Casbin\Enforcer;
use CasbinAdapter\DBAL\Adapter;

$adapter = Adapter::newAdapter([
    'driver' => 'pdo_mysql',
    'host' => '127.0.0.1',
    'dbname' => 'test',
    'user' => 'root',
    'password' => '',
    'port' => '3306',
]);

$enforcer = new Enforcer('path/to/model.conf', $adapter);

添加策略

给alice和bob分配角色:

// alice has the admin role
$enforcer->addRoleForUser('alice', 'admin'); 
// bob has the member role
$enforcer->addRoleForUser('bob', 'member');

给member角色分配权限,member 角色仅对foo资源有查看权限:

$enforcer->addPermissionForUser('member', '/foo', 'GET');
$enforcer->addPermissionForUser('member', '/foo/:id', 'GET');

admin角色对foo拥有增删改查权限:

// admin inherits all permissions of member
$enforcer->addRoleForUser('admin', 'member');

$enforcer->addPermissionForUser('admin', '/foo', 'POST');
$enforcer->addPermissionForUser('admin', '/foo/:id', 'PUT');
$enforcer->addPermissionForUser('admin', '/foo/:id', 'DELETE');

分配完角色和权限后,数据库中的策略规则大致如下:

g, alice, admin
g, bob, member

p, memeber, /foo, GET
p, memeber, /foo/:id, GET

g, admin, member

p, admin, /foo, POST
p, admin, /foo/:id, PUT
p, admin, /foo/:id, DELETE

验证权限

alice 具有admin角色,继承adminmember两个角色的全部权限.

$enforcer->enforce('alice', '/foo', 'GET'); // true
$enforcer->enforce('alice', '/foo', 'GET'); // true

$enforcer->enforce('alice', '/foo', 'POST'); // true
$enforcer->enforce('alice', '/foo/1', 'PUT'); // true
$enforcer->enforce('alice', '/foo/1', 'DELETE'); // true

bob 具有member角色, 只继承member的权限.

$enforcer->enforce('bob', '/foo', 'GET'); // true
$enforcer->enforce('bob', '/foo', 'GET'); // true

$enforcer->enforce('bob', '/foo', 'POST'); // false
$enforcer->enforce('bob', '/foo/1', 'PUT'); // false
$enforcer->enforce('bob', '/foo/1', 'DELETE'); // false

文章转发原始链接:https://segmentfault.com/a/1190000020310242.

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
JWT是一种基于JSON的标准的身份验证和授权令牌,用于在网络应用传递声明。而Casbin是一个强大的访问控制框架,它提供了一种灵活的权限管理方式,可以通过编程或配置文件进行RBAC(基于角色的访问控制权限控制。 使用JWT和Casbin实现RBAC权限管理的一般流程如下: 1. 用户登录:用户提供用户名和密码进行身份验证,验证成功后后端生成JWT令牌并返回给前端。 2. 前端请求授权:前端在每次请求携带JWT令牌,在请求头加入Authorization字段,值为"Bearer + 生成的JWT令牌"。 3. 后端验证:后端接收到请求后,从请求头获取JWT令牌。通过验证JWT的有效性(包括签名、过期时间等),确定用户的身份。 4. Casbin权限验证:后端使用Casbin框架进行RBAC权限验证。Casbin通过配置角色和权限关系的模型文件,根据用户的角色和请求路径,判断用户是否具有访问权限。 5. 授权结果返回:Casbin根据判断结果,返回授权结果给后端。如果授权成功,则继续处理请求;如果授权失败,则返回相应的错误提示。 通过将JWT和Casbin结合使用,可以实现灵活的RBAC权限管理。JWT用于验证用户身份并在请求携带令牌,Casbin用于基于角色的权限控制。这样可以有效管理系统的角色和权限关系,保证用户只能访问其拥有权限的资源,从而提高系统的安全性和可维护性。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值