thinkphp6.0实现的PBAC权限模型案例
时间: 2023-11-12 16:06:28 浏览: 141
thinkphp RBAC项目实例
4星 · 用户满意度95%
PBAC(Policy Based Access Control)是一种基于策略的访问控制模型,它通过将访问控制策略与资源和用户之间的关系进行建模,从而支持动态访问控制和灵活的授权管理。在ThinkPHP 6.0中,我们可以使用RBAC(Role Based Access Control)插件来实现PBAC权限模型。
以下是一个使用RBAC插件实现PBAC权限模型的案例:
1. 安装RBAC插件
在项目根目录下执行以下命令安装RBAC插件:
```
composer require topthink/think-rbac
```
2. 创建权限策略
在config目录下创建rbac.php配置文件,并添加以下内容:
```php
<?php
return [
// 权限策略
'policy' => [
'admin' => \app\policy\AdminPolicy::class, // 管理员策略
'user' => \app\policy\UserPolicy::class, // 普通用户策略
],
];
```
在app/policy目录下创建AdminPolicy.php和UserPolicy.php两个文件,分别实现管理员策略和普通用户策略:
```php
<?php
namespace app\policy;
use think\rbac\Policy;
class AdminPolicy implements Policy
{
public function check(array $context, $action, $resource)
{
// 管理员有所有权限
return true;
}
}
```
```php
<?php
namespace app\policy;
use think\rbac\Policy;
class UserPolicy implements Policy
{
public function check(array $context, $action, $resource)
{
// 普通用户只有查看权限
return $action === 'view';
}
}
```
3. 创建角色和权限
在数据库中创建角色表和权限表,并插入以下数据:
```sql
CREATE TABLE `role` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(50) NOT NULL,
`title` varchar(100) DEFAULT NULL,
`status` tinyint(1) NOT NULL DEFAULT '1' COMMENT '状态',
`create_time` int(11) NOT NULL DEFAULT '0' COMMENT '创建时间',
`update_time` int(11) NOT NULL DEFAULT '0' COMMENT '更新时间',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='角色表';
INSERT INTO `role` (`id`, `name`, `title`, `status`, `create_time`, `update_time`) VALUES
(1, 'admin', '管理员', 1, 0, 0),
(2, 'user', '普通用户', 1, 0, 0);
CREATE TABLE `permission` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(50) NOT NULL,
`title` varchar(100) DEFAULT NULL,
`status` tinyint(1) NOT NULL DEFAULT '1' COMMENT '状态',
`create_time` int(11) NOT NULL DEFAULT '0' COMMENT '创建时间',
`update_time` int(11) NOT NULL DEFAULT '0' COMMENT '更新时间',
`policy` varchar(50) NOT NULL COMMENT '权限策略',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='权限表';
INSERT INTO `permission` (`id`, `name`, `title`, `status`, `create_time`, `update_time`, `policy`) VALUES
(1, 'view', '查看', 1, 0, 0, 'user'),
(2, 'add', '新增', 1, 0, 0, 'admin'),
(3, 'edit', '编辑', 1, 0, 0, 'admin'),
(4, 'delete', '删除', 1, 0, 0, 'admin');
```
4. 配置RBAC插件
在config目录下的rbac.php配置文件中添加以下内容:
```php
<?php
return [
// 认证器
'authenticator' => function ($app) {
return new \app\service\Auth($app->request, $app->rbac);
},
// 用户提供器
'user_provider' => function ($app) {
return new \app\service\UserProvider($app->db);
},
// 权限提供器
'permission_provider' => function ($app) {
return new \app\service\PermissionProvider($app->db);
},
// 角色提供器
'role_provider' => function ($app) {
return new \app\service\RoleProvider($app->db);
},
// 节点提供器
'node_provider' => function ($app) {
return new \app\service\NodeProvider($app->db);
}
];
```
在app/service目录下创建Auth.php、UserProvider.php、PermissionProvider.php、RoleProvider.php和NodeProvider.php五个文件,分别实现RBAC插件需要的接口。
5. 使用RBAC插件
在需要授权的地方调用RBAC插件提供的check方法进行授权:
```php
if (!$this->app->rbac->check('user', 'view', 'post')) {
// 没有权限
$this->error('没有权限');
}
```
在需要认证的地方调用RBAC插件提供的authenticate方法进行认证:
```php
if (!$this->app->rbac->authenticate()) {
// 未登录或登录失效
$this->redirect('/login');
}
```
以上就是一个使用RBAC插件实现PBAC权限模型的案例。通过RBAC插件,我们可以灵活地定义权限策略、角色和权限,并在需要的地方进行授权和认证。
阅读全文