ThinkPHP6 权限包
composer require xiaodi/think-permission
use xiaodi\Permission\Model\Permission;
// 创建一条可查看首页的权限
Permission::create(['name' => 'home']);
use xiaodi\Permission\Model\Role;
// 创建�一个名为编辑的角色
Role::create(['name' => 'writer']);
use xiaodi\Permission\Model\User;
// 创建�一个名为xiaodi的用户
User::create(['name' => 'xiaodi']);
use xiaodi\Permission\Model\Permission;
use xiaodi\Permission\Model\Role;
// 将home规则分配到writer角色
$permission = Permission::findByName('home');
$role = Permission::findByName('writer');
$permission->assignRole($role);
// 将home规则分配到writer角色 (跟上面效果一样)
$permission = Permission::findByName('home');
$role = Permission::findByName('writer');
$role->assignPermission($permission);
use xiaodi\Permission\Model\User;
use xiaodi\Permission\Model\Role;
// 为用户xiaodi分配 writer角色
$user = User::findByName('xiaodi');
$role = Permission::findByName('writer');
$user->assignRole($role);
// 为用户xiaodi分配 writer角色 (跟上面效果一样)
$user = User::findByName('xiaodi');
$role = Permission::findByName('writer');
$role->assignUser($user);
use xiaodi\Permission\Model\Permission;
use xiaodi\Permission\Model\Role;
// home规则与writer角色 解除关系
$permission = Permission::findByName('home');
$role = Permission::findByName('writer');
$permission->removeRole($role);
// writer角色与home规则 解除关系(跟上面效果一样)
$permission = Permission::findByName('home');
$role = Permission::findByName('writer');
$role->removePermission($permission);
use xiaodi\Permission\Model\User;
use xiaodi\Permission\Model\Role;
// 用户xiaodi与writer角色 解除关系
$user = User::findByName('xiaodi');
$role = Permission::findByName('writer');
$user->removeRole($role);
// writer角色与用户xiaodi 解除关系 (跟上面效果一样)
$user = User::findByName('xiaodi');
$role = Permission::findByName('writer');
$role->removeUser($user);
use xiaodi\Permission\Model\User;
$user = User::findByName('xiaodi');
if ($user->can('home')) {
// 有 `home`权限
} else {
// 无 `home`权限
}
用户信息,请手动注入到$request->user
上,并且使用 \xiaodi\Permission\Contract\UserContract
接口。 Demo
/home
路由添加一条权限控制 访问者有 home
权限才能允许访问
Route::post('/home', 'home/index')->middleware('auth', 'home');
<?php
namespace app\model;
use think\Request;
use xiaodi\Permission\Contract\UserContract;
class User implements UserContract
{
use \xiaodi\Permission\Traits\User;
}
<?php
namespace app\middleware;
use think\Request;
use app\model\User;
class Auth
{
public function handle($request, \Closure $next)
{
$uid = 1;
$user = User::find($uid);
$request->user = $user;
return $next($request);
}
}
permission
CREATE TABLE `permission` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(100) NOT NULL COMMENT '规则唯一标识',
PRIMARY KEY (`id`),
UNIQUE KEY `name` (`name`)
) ENGINE=InnoDB AUTO_INCREMENT=38 DEFAULT CHARSET=utf8;
role
CREATE TABLE `role` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(100) NOT NULL COMMENT '角色唯一标识',
PRIMARY KEY (`id`),
UNIQUE KEY `name` (`name`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;
role-permission-access
CREATE TABLE `role_permission_access` (
`role_id` int(11) NOT NULL COMMENT '角色主键',
`permission_id` int(11) NOT NULL COMMENT '规则主键',
PRIMARY KEY (`role_id`,`permission_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
user
CREATE TABLE `user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(50) NOT NULL COMMENT '用户唯一标识',
PRIMARY KEY (`id`),
UNIQUE KEY `name` (`name`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;
user_role_access
CREATE TABLE `user_role_access` (
`user_id` int(11) NOT NULL COMMENT '用户主键',
`role_id` int(11) NOT NULL COMMENT '角色主键',
PRIMARY KEY (`user_id`,`role_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
默认自带以下中间件
- 规则中间件
- 角色中间件
规则中间件
#route/app.php
# 拥有 edit 规则的用户 可以访问此路由
Route::rule('/testPermission', function(){
return 'edit';
}, 'GET')->allowCrossDomain()->middleware('auth.permission', 'edit');
角色中间件
#route/app.php
# 拥有 editer 角色的用户 可以访问此路由
Route::rule('/testRole', function(){
return 'editer';
}, 'GET')->allowCrossDomain()->middleware('auth.role', 'editer');