首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >权限系列 | 基于 Casbin 做 RBAC + RESTful 权限控制

权限系列 | 基于 Casbin 做 RBAC + RESTful 权限控制

作者头像
Tinywan
发布2023-03-08 20:12:43
8300
发布2023-03-08 20:12:43
举报

介绍

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

安装

通过composer安装:

composer require casbin/casbin
composer require casbin/database-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\Database\Adapter;

$adapter = Adapter::newAdapter([
    'type'     => 'mysql', 
    'hostname' => '127.0.0.1',
    'database' => 'test',
    'username' => 'root',
]);

$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
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2021-04-30,如有侵权请联系 cloudcommunity@tencent.com 删除

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

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 介绍
    • 安装
      • 使用 RBAC Model
        • 初始化一个Casbin enforcer
          • 添加策略
            • 验证权限
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档