上一篇文章我们实现通过JWT实现了在Laravel中进行Token的认证,下面我们来实现一下Rbac权限管理的功能。
我们之前的后台项目的权限管理功能都是靠开发一行一行代码码出来的,这种方式的不仅开发速度比较的慢,而且容易出错,不利于以后的扩展。所以新项目我们使用的Entrust这个开发包来是西安用户权限的管理。下面我们直接看是实现的具体的步骤。
1:通过Composer安装Entrust这个扩展包
composer require "zizaco/entrust:1.2.*@dev"复制代码
2:在Laravel中进行相关的配置
//在Path/config/app.php中注册相应的服务提供者
'Zizaco\Entrust\EntrustServiceProvider',
//在Path/config/app.php中注册需要使用到的门面
'Entrust' => 'Zizaco\Entrust\EntrustFacade',复制代码
3:进行系统的配置
Entrust会读取config/auth.php里面的配置, 去决定使用那个 Model 和 用户表名。默认情况下,使用的是User这张表,以及app/User.php这个model,如果没有特殊需求的,这一步可以忽略。
4:执行migrate命令,生成所依赖的表
php artisan entrust:migration
php artisan migrate复制代码
这样,就会生成roles表(角色表),permissions表(权限表),role_user表(用户角色关联表),permission_role表(角色权限关联表)----到这里,大家应该就很清楚了,rbac认证的实现就是依靠上面几张表来实现的。
5:创建所需要的model
上面我们通过执行migrate命令生成了如上的几张表,我们后续需要直接操作上面的Roles/Permissions表,所以需要创建相对应的model文件。
<?php
namespace App;
use Zizaco\Entrust\EntrustRole;
class Role extends EntrustRole
{
//pass
}
?>
<?php
namespace App;
use Zizaco\Entrust\EntrustPermission;
class Permission extends EntrustPermission
{
//pass
}
?>复制代码
6:修改model文件User.php
<?php
namespace App;
use Illuminate\Notifications\Notifiable;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Zizaco\Entrust\Traits\EntrustUserTrait; //新增
class User extends Authenticatable
{
use Notifiable;
use EntrustUserTrait; //新增
//pass
}复制代码
上面的代码中使用到了Trait这个PHP新的特性,主要是用来解决PHP单继承机制的弊端的,具体的使用方法很简单,有兴趣的同学可以自己查查看一下。
7:配置完成,开始为用户添加角色以及分配权限
创建角色/分配角色以及分配权限的操作很简单,下面是实例代码:
//直接在某个控制器中写就ok了
public function test()
{
//创建角色owner
$owner = new Role();
$owner->name = 'owner';
$owner->display_name = '项目拥有者';
$owner->description = 'User is the owner of a given project';
$owner->save();
//创建角色admin
$admin = new Role();
$admin->name = 'admin';
$admin->display_name = '后台权限管理者';
$admin->description = 'User is allowed to manage and edit other users';
$admin->save();
$admin = Role::find(2);
//为具体的用户分配角色
$user = User::first();
$user->attachRole($admin);
//为用户具体的角色添加执行权限
$createPost = new Permission();
$createPost->name = 'create-post';
$createPost->display_name = 'Create Posts';
$createPost->description = 'create new blog posts';
$createPost->save();
$editUser = new Permission();
$editUser->name = 'edit-user';
$editUser->display_name = 'Edit Users';
$editUser->description = 'edit existing users';
$editUser->save();
$owner->attachPermission($createPost);
$admin->attachPermissions(array($createPost, $editUser));
//检测用户的权限以及角色
$user->hasRole('owner');
$user->hasRole('admin');
$user->can('edit-user');
$user->can('create-post');
}复制代码
上面我们就实现了角色以及权限的分发,具体到项目上,我们可以单独做一个模块,用来添加/删除角色以及添加/删除权限,大家要怎么做,就可以自由发挥了。
8:角色权限配置完毕,实现权限检测
权限管理最重要的一点就是实现权限的访问控制,Entrust可以为我们在路由层上帮助我们实现访问权限控制,下面我们就开始说权限访问控制的具体的实现。
//新建一个名为VerifyRbac的中间件,具体代码如下:
<?php
namespace App\Http\Middleware;
use Closure;
use App\User;
use JWTAuth;
class VerifyRbac
{
public function handle($request, Closure $next)
{
//获取路由中的as参数(这里我们将as参数的值与具体的权限一一对应起来)
$permission = $request->route()->action['as'];
//通过上篇文章实现Token认证JWT来获取当前访问的用户信息
$authUser =JWTAuth::toUser(); //toUser()方法会根据传入的token返回一个User对象,从而获取当前用户的信息
//检查用户的角色以及权限
if ($authUser->hasRole('admin') || $authUser->can($permission)) {
return $next($request);
}
return response()->json(['code' => '-403', 'msg' => '抱歉,您没有权限执行该操作']);
}
}
//path/app/Http/Kernel.php文件中注册该中间件
protected $routeMiddleware = [
'rbac'=> \App\Http\Middleware\VerifyRbac::class,
];
//最后在需要进行权限检测的路由上添加该中间件
Route::group(['middleware' => ['jwt.auth','rbac']], function () {
//测试
Route::any('/test',['as'=>'test','uses'=>'LoginController@test']);
});复制代码
对上面的代码不熟悉的同学,看一下注释,相信都能明白的。ok,上面我们就实现了Rabc权限的控制了,是不是很简单!!!