1、安装Entrust
通过composer安装扩展包 :composer require zizaco/entrust 5.2.x-dev
安装完成后需要在config/app.php中注册服务提供者到providers数组:
Zizaco\Entrust\EntrustServiceProvider::class,
同时在该配置文件中注册相应门面到aliases数组:
'Entrust' => Zizaco\Entrust\EntrustFacade::class,
如果使用中间件需要添加如下代码到app/Http/Kernel.php的routeMiddleware数组:
'role' => \Zizaco\Entrust\Middleware\EntrustRole::class,
'permission' => \Zizaco\Entrust\Middleware\EntrustPermission::class,
'ability' => \Zizaco\Entrust\Middleware\EntrustAbility::class,
2、配置
在配置文件config/auth.php中设置合适的值,Entrust会使用这些配置值来选择相应的用户表和模型类。
php artisan vendor:publish
该命令会在config目录下创建一个entrust.php文件。
3、用户角色权限表
使用Entrust提供的迁移命令生成迁移文件:
php artisan entrust:migration
然后通过以下命令生成相应的数据表:
php artisan migrate
最终会生成4张新表:
roles—— 存储角色
permissions—— 存储权限
role_user—— 存储角色与用户之间的多对多关系
permission_role—— 存储角色与权限之间的多对多关系
4、模型类
Role
我们需要创建Role模型类app/Models/Role.php并编辑其内容如下:
use Zizaco\Entrust\EntrustRole;
class Role extends EntrustRole{}
Permission
接下来创建Permission模型app/models/Permission.php并编辑其内容如下:
use Zizaco\Entrust\EntrustPermission;
class Permission extends EntrustPermission
{
}
User
接下来我们在User模型中使用EntrustUserTrait:
use Illuminate\Notifications\Notifiable;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Zizaco\Entrust\Traits\EntrustUserTrait;
use Illuminate\Database\Eloquent\Model;
class User extends Authenticatable
{
use EntrustUserTrait
{
EntrustUserTrait::can as hasPermission;
}
}
5.创建角色/权限并进行分配
/**
* 添加角色
*/
public function add_role()
{
$role=new Role();
$role->name='admin';
$role->display_name='超级管理员';
$role->description='';
$role->save();
}
/**
* 给用户分配角色
*/
public function send_role()
{
$user = User::where('id', '=', '1')->first();
//分配一个用户
$user->attachRole(1); //将角色id为1的分配给用户
//分配多个角色
$user->attachRoles() //括号里放数组
}
/**
* 添加权限
*/
public function add_permission()
{
$createPost = new Permission();
$createPost->name = 'login';
$createPost->display_name = '登录';
$createPost->description = '';
$createPost->save();
}
/**
* 分配权限
*/
public function send_permission()
{
//查询角色id为5的
$role = Role::where(['id'=>1])->first();
//分配单个权限
$role->attachPermission(1);
//分配多个权限
$role->attachPermission(array(1,2,3));
}
6、检查角色&权限
//检查用户是否有admin的角色,成功返回true否则false
$user->hasRole('admin');
//检查用户是否有login的权限,成功返回true否则false,一下两者皆可
$user->can("login");
$user->hasPermission('login');
7.用中间件验证用户是否有当前路由的权限
namespace App\Http\Middleware;
use Closure;
use App\Http\Models\Admin;
class RbacMiddleware
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
{
$uid=\Session::get('admin_id');
$user=Admin::where(['id'=>$uid])->first();
//获取当前访问的路由
$uri = $request->path();
if($uri!='admin/index' && $user->hasPermission($uri)==false){
return redirect('admin/index');
}
return $next($request);
}