1. 云栖社区>
  2. PHP教程>
  3. 正文

Laravel的权限管理(RBAC)

作者:用户 来源:互联网 时间:2017-11-30 15:54:22

权限管理rbaclaravel

Laravel的权限管理(RBAC) - 摘要: 本文讲的是Laravel的权限管理(RBAC), 1、安装Entrust     通过composer安装扩展包 :composer require zizaco/entrust 5.2.x-dev    安装完成后需要在config/app.php中注册服务提供者到providers数

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);
    }

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);    }



以上是云栖社区小编为您精心准备的的内容,在云栖社区的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索权限 , 管理 , rbac laravel ,以便于您获取更多的相关知识。