RBAC权限(RBAC-business)
业务介绍
简易RBAC 权限业务组件,支持角色,权限,用户。和Symfony路由绑定关系,支持多平台,各个位置皆可使用。
源码地址
安装
composer require phpzlc/rbac-business
实战例子
可以在 demo-blog 或 admin-business 找到实战应用。
权限注册
-
路由注册
admin_account: prefix: /account resource: 'account.yaml' options: platform: 平台 permission_group: 权限分组 permission_tag: 权限标识 permission_description: 权限描述
技巧
路由配置的时候,上层的
options
设置的参数会在下层的所有路由中生效。如果两个路由共用一个权限,只要将
permission_tag
设置为一样即可。系统以第一次出现的配置参数为准,后面相同的权限其他参数可忽略。场景
可以在入口方法处验证路由是否有访问权限,便捷鉴权。
use App\Business\RBACBusiness\RBACBusiness; $this->rbac = new RBACBusiness($this->container, PlatformClass::getPlatform()); $this->rbac->setIsSuper(CurAuthSubject::getCurUser()->getIsSuper()); //对路由进行权限校验 if(!$this->rbac->canRoute($this->get('request_stack')->getCurrentRequest()->get('_route'))){ if(self::getReturnType() == SystemBaseController::RETURN_HIDE_RESOURCE){ return Responses::error('权限不足'); }else{ return $this->render('@PHPZlcAdmin/page/no_permission.html.twig'); } } //对菜单进行权限筛选 $this->adminStrategy->setMenus($this->rbac->menusFilter($this->adminStrategy->getMenus()));
-
自由注册
由于有些权限更为自由,和路由不是强绑定关系,就需要通过代码自由注册。
书写位置: src/Business/RBACBusiness/PermissionBusiness.php
* * @return array[] */ public function getBuiltPermissions() { return [ [ 'platform' => '平台', 'permission_tag' => '权限标识', 'permission_description' => '权限描述', 'permission_group' => '权限分组', 'routes' => [], //允许路由名 ] ]; }
权限写库和更新
-
第一次写库
执行内置数据命令的时候一并安装
-
更新方法
(new PermissionBusiness($this->container))->builtUpdatePermission();
-
安装
admin-business
组件的话可以点击页面上的清除缓存按钮更新。
页面效果展示
以下效果来自admin-business
-
角色与权限(首页)
-
角色与权限(分配权限)
-
账号和角色
鉴权与核心方法
-
核心逻辑类
文件路径:
src/Business/RBACBusiness/RBACBusiness.php
类命名空间
use App\Business\RBACBusiness\RBACBusiness;
初始化
new RBACBusiness($this->container, PlatformClass::getPlatform());
-
设置是否为超级管理员
public function setIsSuper($isSuper)
如果是超级管理员,则拥有全部权限。
-
判断是否有权限
/** * 验证是否有权限 * * @param $permissions //需要验证的权限标记,支持多个。可传数组或字符串。 * @param string $model //匹配模式 or 或者 and * @param UserAuth|null $userAuth // 需要鉴权的用户,不传为当前登录用户 * @return bool */ public function can($permissions, $model = 'and', UserAuth $userAuth = null)
-
判断是否有访问路由的权限
/** * 验证路由是否有权限访问 * * @param $route // 路由名 * @param UserAuth|null $userAuth //需要鉴权的用户,不传为当前登录用户 * @return bool */ public function canRoute($route, UserAuth $userAuth = null)
-
清除用户权限菜单缓存
/** * 清除缓存 * * @param UserAuth|null $userAuth //需要鉴权的用户,不传为当前登录用户 */ public function clearCache(UserAuth $userAuth = null)
在页面中鉴权