项目作者: friendsofthinkphp

项目描述 :
ThinkPHP 6 权限认证
高级语言: PHP
项目地址: git://github.com/friendsofthinkphp/think-permission.git
创建时间: 2019-05-10T06:39:25Z
项目社区:https://github.com/friendsofthinkphp/think-permission

开源协议:Other

下载


ThinkPHP Permission

ThinkPHP6 权限包

Latest Stable Version
Total Downloads
Latest Unstable Version
LICENSE

安装

  1. composer require xiaodi/think-permission

使用

创建必要数据

规则

  1. use xiaodi\Permission\Model\Permission;
  2. // 创建一条可查看首页的权限
  3. Permission::create(['name' => 'home']);

角色

  1. use xiaodi\Permission\Model\Role;
  2. // 创建一个名为编辑的角色
  3. Role::create(['name' => 'writer']);

用户

  1. use xiaodi\Permission\Model\User;
  2. // 创建一个名为xiaodi的用户
  3. User::create(['name' => 'xiaodi']);

分配关系

规则与角色

  1. use xiaodi\Permission\Model\Permission;
  2. use xiaodi\Permission\Model\Role;
  3. // 将home规则分配到writer角色
  4. $permission = Permission::findByName('home');
  5. $role = Permission::findByName('writer');
  6. $permission->assignRole($role);
  7. // 将home规则分配到writer角色 (跟上面效果一样)
  8. $permission = Permission::findByName('home');
  9. $role = Permission::findByName('writer');
  10. $role->assignPermission($permission);

用户与角色

  1. use xiaodi\Permission\Model\User;
  2. use xiaodi\Permission\Model\Role;
  3. // 为用户xiaodi分配 writer角色
  4. $user = User::findByName('xiaodi');
  5. $role = Permission::findByName('writer');
  6. $user->assignRole($role);
  7. // 为用户xiaodi分配 writer角色 (跟上面效果一样)
  8. $user = User::findByName('xiaodi');
  9. $role = Permission::findByName('writer');
  10. $role->assignUser($user);

解除关系

解除规则与角色

  1. use xiaodi\Permission\Model\Permission;
  2. use xiaodi\Permission\Model\Role;
  3. // home规则与writer角色 解除关系
  4. $permission = Permission::findByName('home');
  5. $role = Permission::findByName('writer');
  6. $permission->removeRole($role);
  7. // writer角色与home规则 解除关系(跟上面效果一样)
  8. $permission = Permission::findByName('home');
  9. $role = Permission::findByName('writer');
  10. $role->removePermission($permission);

解除用户与角色

  1. use xiaodi\Permission\Model\User;
  2. use xiaodi\Permission\Model\Role;
  3. // 用户xiaodi与writer角色 解除关系
  4. $user = User::findByName('xiaodi');
  5. $role = Permission::findByName('writer');
  6. $user->removeRole($role);
  7. // writer角色与用户xiaodi 解除关系 (跟上面效果一样)
  8. $user = User::findByName('xiaodi');
  9. $role = Permission::findByName('writer');
  10. $role->removeUser($user);

权限判断

手动

  1. use xiaodi\Permission\Model\User;
  2. $user = User::findByName('xiaodi');
  3. if ($user->can('home')) {
  4. // 有 `home`权限
  5. } else {
  6. // 无 `home`权限
  7. }

路由守护

用户信息,请手动注入到$request->user上,并且使用 \xiaodi\Permission\Contract\UserContract 接口。 Demo
/home 路由添加一条权限控制 访问者有 home权限才能允许访问

  1. Route::post('/home', 'home/index')->middleware('auth', 'home');

中间件注入用户

用户模型

  1. <?php
  2. namespace app\model;
  3. use think\Request;
  4. use xiaodi\Permission\Contract\UserContract;
  5. class User implements UserContract
  6. {
  7. use \xiaodi\Permission\Traits\User;
  8. }

注入用户信息

  1. <?php
  2. namespace app\middleware;
  3. use think\Request;
  4. use app\model\User;
  5. class Auth
  6. {
  7. public function handle($request, \Closure $next)
  8. {
  9. $uid = 1;
  10. $user = User::find($uid);
  11. $request->user = $user;
  12. return $next($request);
  13. }
  14. }

数据表

  • permission

    1. CREATE TABLE `permission` (
    2. `id` int(11) NOT NULL AUTO_INCREMENT,
    3. `name` varchar(100) NOT NULL COMMENT '规则唯一标识',
    4. PRIMARY KEY (`id`),
    5. UNIQUE KEY `name` (`name`)
    6. ) ENGINE=InnoDB AUTO_INCREMENT=38 DEFAULT CHARSET=utf8;
  • role

    1. CREATE TABLE `role` (
    2. `id` int(11) NOT NULL AUTO_INCREMENT,
    3. `name` varchar(100) NOT NULL COMMENT '角色唯一标识',
    4. PRIMARY KEY (`id`),
    5. UNIQUE KEY `name` (`name`)
    6. ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;
  • role-permission-access

    1. CREATE TABLE `role_permission_access` (
    2. `role_id` int(11) NOT NULL COMMENT '角色主键',
    3. `permission_id` int(11) NOT NULL COMMENT '规则主键',
    4. PRIMARY KEY (`role_id`,`permission_id`)
    5. ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
  • user

    1. CREATE TABLE `user` (
    2. `id` int(11) NOT NULL AUTO_INCREMENT,
    3. `name` varchar(50) NOT NULL COMMENT '用户唯一标识',
    4. PRIMARY KEY (`id`),
    5. UNIQUE KEY `name` (`name`)
    6. ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;
  • user_role_access

    1. CREATE TABLE `user_role_access` (
    2. `user_id` int(11) NOT NULL COMMENT '用户主键',
    3. `role_id` int(11) NOT NULL COMMENT '角色主键',
    4. PRIMARY KEY (`user_id`,`role_id`)
    5. ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

中间件

默认自带以下中间件

  • 规则中间件
  • 角色中间件

规则中间件

  1. #route/app.php
  2. # 拥有 edit 规则的用户 可以访问此路由
  3. Route::rule('/testPermission', function(){
  4. return 'edit';
  5. }, 'GET')->allowCrossDomain()->middleware('auth.permission', 'edit');

角色中间件

  1. #route/app.php
  2. # 拥有 editer 角色的用户 可以访问此路由
  3. Route::rule('/testRole', function(){
  4. return 'editer';
  5. }, 'GET')->allowCrossDomain()->middleware('auth.role', 'editer');