tp5.1 的RBAC插件安装 及使用方法

转载自caigan的技术博客

之前自己安装说明安装,但是没有看依赖关系,所以一直失败。直到看到一篇博客的介绍,才明白需要依赖插件。特此转载分享。

tp5.0版本不能使用

安装方法

先安装composer如果不知道怎么安装使用composer请自行百度。 
打开命令行工具切换到你的tp5项目根目录

如果没有安装migaration与nestedset,先安装

composer require topthink/think-migration:*

 composer require gmars/tp5-nestedsets:dev-master

composer require gmars/tp5-rbac
  • 1

如果该方法报错请按照以下方式操作:

  1. 打开项目根目录下的composer.json
  2. 在require中添加”gmars/tp5-rbac”: “dev-master”
  3. 运行composer update

添加后composer.json应该有这样的部分:

    "require": {
        "php": ">=5.4.0",
        "topthink/framework": "^5.0", "gmars/tp5-rbac": "dev-master" },
  • 1
  • 2
  • 3
  • 4
  • 5

数据迁移

在使用本插件之前需要有rbac锁需要的数据库。在迁移之前如果你的数据库中已有user数据表那么请你备份自己的user数据表后删除。

在你的项目的某个config.php中加入如下配置:

'migration' => [
    'path' => ROOT_PATH .'vendor/gmars/tp5-rbac/'
],
  • 1
  • 2
  • 3

然后把命令行切换到你的项目根目录Windows是cmd运行如下命令

php think migrate:run
  • 1

如果迁移运行成功会在你的数据库中生成如下几张表:

user              用户表
user_role         用户角色对应表
role              角色表
role_permission   角色权限对应表
permission        角色表
  • 1
  • 2
  • 3
  • 4
  • 5

使用该插件–RBAC的管理

在一个系统中RBAC是基于角色的权限控制。作为开发人员需要明白这是两个不同的过程。第一个就是构建系统的RBAC结构,包括添加权限,角色,用户,用户角色对应关系,角色权限对应关系等。

在此先说明RBAC管理:

1.添加用户

这一步是在用户注册时要做的一步,就是讲注册的用户添加到user表中。

$rbacObj = new Rbac();
$data = ['user_name' => 'zhangsan', 'status' => 1, 'password' => md5('zhangsan')]; $rbacObj->createUser($data);
  • 1
  • 2
  • 3

创建用户时传入唯一一个参数必须是数组。数组中应该包含用户表需要的数据。如果出现其他非user表的字段则会抛出异常。 
该方法返回的结果为false或者Exception或者新添加用户的id

2.添加权限

这一步是构建系统的权限。一般我们是以请求的路由为权限的识别标志。在该插件中使用path字段。

例如我们的系统中有商品列表这样的一个操作需要授权。

其路由为 /index/goods/list

添加路由如下:

$rbacObj = new Rbac();
$data = [
    'name' => '商品列表', 'status' => 1, 'description' => '查看商品的所有列表', 'path' => '/index/goods/list', 'create_time' => time() ]; $rbacObj->createPermission($data);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

3.添加角色

在RBAC的角色中角色是有父子关系的,也就是说所添加的角色可以是另一个角色的子角色。

$rbacObj = new Rbac();
$data = [
    'name' => '商品管理员', 'status' => 1, 'description' => '商品管理员负责商品的查看修改删除等操作', 'sort_num' => 10, 'parent_id' => 1 ]; $rbacObj->createRole($data);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

需要注意的是在data中有个字段为parent_id这个字段标识了所要添加的角色的父角色。如果留为空则便是添加的父角色。

4.为用户分配角色

当然一个用户可以有多个角色。一般是使用多选框或其他形式选择后以数组的方式传入的。

例如:

$rbacObj = new Rbac();
$rbacObj->assignUserRole(1, [1, 2]);
  • 1
  • 2

assignUserRole(userId,arrayroleArray = [])

该方法的第一个参数为用户id第二个参数是一个一位数组,其元素为角色的id

5.为角色分配权限

例如:

$rbacObj = new Rbac();
$rbacObj->assignRolePermission(1, [1, 2]);
  • 1
  • 2

将id分别为1,2的权限分配给id为1的角色

6.删除角色

删除角色的同时必须删除角色和权限的对应数据

$rbacObj = new Rbac();
$rbacObj->delRole(1);
  • 1
  • 2

其中需要传入的是角色id

7.将一个角色移到另一个角色下

以上已经说明了角色是有父子关系的那么肯定能够移动其位置

$rbacObj = new Rbac();
$rbacObj->moveRole(1,3);
  • 1
  • 2

该例子是将id为1的角色移动到id为3的角色下作为子角色。

还有其他修改删除等方法的文档日后再补全,功能是有的

使用该插件–RBAC权限验证

登录后获取权限列表

如果自己写权限验证则请忽略这一步,如果要使用rbac插件来验证权限则必须要这样做。

在登录成功后做如下操作:

$rbacObj = new Rbac();
$rbacObj->cachePermission(1);
  • 1
  • 2

这个方法是查询id为1的用户的所有权限并且以path索引后存入cache

请求时的权限验证

当然对于每一个方法都要进行权限验证时我们一般是在某一个父类中定义一个方法进行权限验证,验证如下:

$rbacObj = new Rbac();
$rbacObj->can('/index/goods/list');
  • 1
  • 2

该方法是验证当前用户有没有操作/index/goods/list的权限,如果有则返回true如果无则返回false

其中can的参数可以使用tp5的特性获取。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Rbac(Role-Based Access Control)是一种基于角色的访问控制,它将权限授权给不同的角色,然后将这些角色授予给用户。在Vue实现Rbac需要以下步骤: 1. 定义角色和权限 在Vue,可以使用常量或者枚举来定义角色和权限,例如: ```js // 角色 export const ROLE_ADMIN = 'admin'; export const ROLE_USER = 'user'; // 权限 export const PERMISSION_VIEW_USER = 'view_user'; export const PERMISSION_EDIT_USER = 'edit_user'; ``` 2. 创建路由和对应的权限 在路由,可以定义每个页面需要的权限。例如: ```js const routes = [ { path: '/users', name: 'users', component: Users, meta: { requiresAuth: true, // 需要登录才能访问 permissions: [PERMISSION_VIEW_USER] // 需要查看用户的权限 } }, { path: '/users/edit/:id', name: 'editUser', component: EditUser, meta: { requiresAuth: true, permissions: [PERMISSION_EDIT_USER] // 需要编辑用户的权限 } } ] ``` 3. 创建验证函数 在Vue,可以使用路由守卫来验证用户是否有权限访问某个页面。需要创建一个验证函数,它会检查用户的角色和权限是否匹配。例如: ```js // 判断用户是否有权限访问当前页面 function hasPermission(userRole, requiredPermissions) { if (userRole === ROLE_ADMIN) { return true; // 管理员拥有所有权限 } return requiredPermissions.every(permission => userPermissions.includes(permission)); } // 路由守卫 router.beforeEach((to, from, next) => { const userRole = store.getters.userRole; const requiresAuth = to.matched.some(record => record.meta.requiresAuth); const requiredPermissions = to.meta.permissions || []; if (requiresAuth && !store.getters.isLoggedIn) { next('/login'); } else if (requiresAuth && !hasPermission(userRole, requiredPermissions)) { next('/403'); // 没有权限访问 } else { next(); } }) ``` 4. 在组件使用权限 在组件,可以根据用户的角色和权限来显示或隐藏某些功能。例如: ```html <template> <div> <button v-if="hasPermission(PERMISSION_EDIT_USER)" @click="editUser">编辑用户</button> </div> </template> <script> import { PERMISSION_EDIT_USER } from '@/constants'; export default { methods: { hasPermission(permission) { return this.$store.getters.userPermissions.includes(permission); }, editUser() { // 编辑用户 } } } </script> ``` 以上就是Vue实现Rbac的基本步骤。需要注意的是,为了安全起见,权限验证应该在服务端进行,前端验证只是为了提高用户体验。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值