shasoft/rbac 问题修复 & 功能扩展

解决BUG、新增功能、兼容多环境部署,快速响应你的开发需求

邮箱:yvsm@zunyunkeji.com | QQ:316430983 | 微信:yvsm316

shasoft/rbac

Composer 安装命令:

composer require shasoft/rbac

包简介

PHP Role-Based Access Control

关键字:

README 文档

README

Этот пакет содержит библиотеку RBAC для PHP

Введение

Роли и разрешения

У каждой роли могут быть дочерние роли а также разрешения. Родительские роли наследуют все разрешения дочерних ролей.

flowchart BT
    admin([admin])
    moderator([moderator])
    user([user])
    guest([guest])
    forum.view(forum.view)
    forum.edit(forum.edit)
    forum.remove(forum.remove)
    user.ban(user.ban)
    moderator.assign(moderator.assign)

    moderator --> admin
    user --> moderator
    guest --> user
    forum.view --> guest
    forum.edit --> user
    forum.remove --> moderator
    user.ban --> moderator
    moderator.assign --> admin

    classDef default fill:LightSalmon
    classDef Permission fill:Khaki

    class admin,moderator,user,guest Role
    class forum.view,moderator.assign,forum.edit,forum.remove,user.ban Permission
Loading

В результате наследования разрешения каждой роли:

роль: разрешения

  • admin: moderator.assign, user.ban, forum.remove, forum.edit, forum.view
  • moderator: user.ban, forum.remove, forum.edit, forum.view
  • user: forum.edit, forum.view
  • guest: forum.view

Права пользователя

Каждому пользователю назначается список ролей и разрешений

flowchart BT
    userAdmin@{ shape: curv-trap, label: "Admin" }
    userModerator@{ shape: curv-trap, label: "Moderator" }
    userUser1@{ shape: curv-trap, label: "User1" }
    userUser2@{ shape: curv-trap, label: "User2" }
    userGuest@{ shape: curv-trap, label: "Guest" }
    admin([admin])
    moderator([moderator])
    forum.remove(forum.remove)
    user([user])
    guest([guest])

    admin --> userAdmin
    moderator --> userModerator
    user --> userUser2
    forum.remove --> userUser2
    user --> userUser1
    guest --> userGuest

    classDef User fill:LightSkyBlue,stroke:Green,stroke-width:2px
    classDef default fill:LightSalmon
    classDef Permission fill:Khaki

    class admin,moderator,user,guest Role
    class forum.view,moderator.assign,forum.edit,forum.remove,user.ban Permission
    class userAdmin,userModerator,userUser1,userUser2,userGuest User
Loading

Установка

composer require shasoft/rbac

Пример использования

Схема прав

flowchart BT
    user@{ shape: curv-trap, label: "1" }
    p1(p1)
    p2(p2)
    p3(p3)
    p4(p4)
    R1([R1])

    R1 --> user
    p2 --> user
    p1 --> R1
    p4 --> R1

    classDef User fill:LightSkyBlue,stroke:Green,stroke-width:2px
    classDef default fill:LightSalmon
    classDef Permission fill:Khaki

    class R1 Role
    class p1,p2,p3,p4 Permission
    class user User
Loading

Код использования схемы

// Создать сервис
$rbac = new Rbac((new SQLiteDatabase('filename'))->create());
// Создать схему ролей и разрешений для пользователя
$p1 = $rbac->permission('p1');
$p2 = $rbac->permission('p2');
$p3 = $rbac->permission('p3');
$p4 = $rbac->permission('p4')->setLinkToBan(true); // Связать с баном
$R1 = $rbac->permission('R1')->permissionAdd($p1)->permissionAdd($p4);
$user = $rbac->user(1)->roleAdd($R1)->permissionAdd($p2);
// Сохранить данные в хранилище
$rbac->flush();
// Выполнить проверки
$user->can('p1'); // True
$user->can('p2'); // True
$user->can('p3'); // False
$user->can('p4'); // True
// Забанить пользователя на 5 часов
$user->setBan(new \Datetime('+5 hours'));
$rbac->flush();
// Выполнить проверки
$user->can('p1'); // True
$user->can('p2'); // True
$user->can('p3'); // False
$user->can('p4'); // False (так как разрешение связано с баном, то теперь оно не доступно)

Интерфейсы

interface IRbac
{
    public function permission(string $name): IPermission;
    public function permissions(): array;

    public function role(string $name): IRole;
    public function roles(): array;

    public function user(int $userId): IUser;
    public function users(): array;

    public function reset(): IRbac;
    public function flush(): IRbac;
}

interface IUser
{
    public function delete(): void;
    public function restore(): void;
    public function hasExists(): bool;

    public function id(): int;

    public function roleAdd(IRole|string $role): IUser;
    public function roleRemove(IRole|string $role): IUser;
    public function roles(bool $all = false): array;

    public function permissionAdd(IPermission|string $permission): IUser;
    public function permissionRemove(IPermission|string $permission): IUser;
    public function permissions(bool $all = false): array;

    public function can(string $permissionName): bool;
    public function hasRole(string $roleName): bool;

    public function ban(): bool;
    public function setBan(?\DateTime $dtTo): IUser;
    public function getBan(): ?\DateTime;

    public function values(string $prefix): array;
}

interface IRole
{
    public function delete(): void;
    public function restore(): void;
    public function hasExists(): bool;

    public function name(): string;

    public function setDescription(string $value): IRole;
    public function description(): string;

    public function roleAdd(IRole|string $role): IRole;
    public function roleRemove(IRole|string $role): IRole;
    public function roles(bool $all = false): array;

    public function permissionAdd(IPermission|string $permission): IRole;
    public function permissionRemove(IPermission|string $permission): IRole;
    public function permissions(bool $all = false): array;
}

interface IPermission
{
    public function delete(): void;
    public function restore(): void;
    public function hasExists(): bool;

    public function name(): string;

    public function setDescription(string $value): IPermission;
    public function description(): string;

    public function setLinkToBan(bool $value): IPermission;
    public function hasLinkToBan(): bool;

    public function setPrefixValue(string $value): IPermission;
    public function getPrefixValue(): string;
}

Поддержка пользовательских хранилищ

Для создания своего хранилище необходимо реализовать следующий интерфейс.

interface IStorage
{
    public function onFlush(array $actions): void;
    public function onReset(): void;

    public function onReadPermission(array $contexts): void;
    public function onReadAllPermission(int $maxRecords, callable $cb): void;

    public function onReadRole(array $contexts): void;
    public function onReadAllRole(int $maxRecords, callable $cb): void;

    public function onReadUser(array $contexts): void;
    public function onReadAllUser(int $maxRecords, callable $cb): void;

    public function onCacheRead(string $type, string $name): ?array;
    public function onCacheWrite(string $type, string $name, array $refs): void;
    public function onCacheGets(string $type, array $refs, int $maxRecords, callable $cb): void;
    public function onCacheRemove(string $type, array $names): void;
}

По умолчанию в штатную поставку входит реализация хранилища для работы с sqlite

shasoft/rbac 适用场景与选型建议

shasoft/rbac 是一款 基于 PHP 开发的 Composer 扩展包,目前已累计 1 次下载、GitHub Stars 达 0, 最近一次更新时间为 2025 年 10 月 23 日, 在 PHP 生态内属于活跃度较高的组件。

它主要适用于以下技术方向: 「access」 「rbac」 等业务场景。在实际项目中,围绕这些方向常见需要落地的问题包括:接口对接、性能调优、并发安全、与既有框架(Laravel / ThinkPHP / Yii / Webman 等)的兼容适配,以及生产环境的日志埋点与稳定性保障。

我们在过去多个企业项目中使用过 shasoft/rbac 或与其功能相近的方案,如果你在选型或落地过程中遇到问题,例如 版本兼容、二次改造、私有化封装、与内部系统对接、生产 BUG 排查,欢迎联系我们协助评估。

围绕 shasoft/rbac 我们能提供哪些服务?
定制开发 / 二次开发

基于 shasoft/rbac 在你已有业务上做功能扩展、字段裁剪、UI 适配、与内部账号 / 权限 / 日志系统的深度对接。

BUG 修复 & 性能优化

线上偶发问题、内存泄漏、慢查询、并发异常等排查修复;针对高流量场景做缓存、队列、索引层面的调优。

项目外包 & 长期维护

承接完整的项目从需求 → 设计 → 开发 → 上线 → 长期运维;也可按月提供技术保姆服务。

yvsm@zunyunkeji.com QQ:316430983 微信:yvsm316 西安尊云信息科技 · 专注 PHP / Go / 分布式系统研发

统计信息

  • 总下载量: 1
  • 月度下载量: 0
  • 日度下载量: 0
  • 收藏数: 0
  • 点击次数: 8
  • 依赖项目数: 0
  • 推荐数: 0

GitHub 信息

  • Stars: 0
  • Watchers: 0
  • Forks: 0
  • 开发语言: PHP

其他信息

  • 授权协议: MIT
  • 更新时间: 2025-10-23