Laravel的权限管理(RBAC)

来源:互联网 发布:朴素贝叶斯算法实例 编辑:程序博客网 时间:2024/05/21 11:25

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



原创粉丝点击