后台权限模块——实现用户权限功能

1.新建中间件

f:\xampp\php\php.exe artisan make:middleware HasRole

2.编写中间件

class HasRole
{
    public function handle($request, Closure $next)
    {
        //1.获取当前请求的路由,对应的控制器方法名
        //"App\Http\Controllers\Admin\LoginController@index"
        $route = Route::current()->getActionName();
        //dd($route);

        //2.获取当前用户的权限组
        //(1)根据session中用户的id,查询出对应的用户信息
        $user = User::find(session()->get('user')->user_id);
        //(2)通过用户模型关联到角色模型,获取用户对应的所有角色
        $roles = $user->role;
        //dd($roles);
        //(3)循环用户对应的所有角色,获取所有角色对应的所有权限
        //存放权限对应的per_url字段值,就是权限列表
        $arr = [];
        foreach ($roles as $v) {
            //每次循环出一个角色,再从角色模型关联到权限模型,获取每个角色对应的所有权限
            $perms = $v->Permission;
            //循环每个角色对应的所有权限,
            foreach ($perms as $perm) {
        //(4)将循环出来的所有权限对应的per_url,放进$arr数组中,就是用户拥有的所有权限
                $arr[] = $perm->per_url;
            }
        }
        //dd($arr);
        //(5)去掉用户拥有的所有角色的所有权限重复的部分
        $arr = array_unique($arr);

        //3.判断当前请求的路由对应的控制器方法名$route是否在当前用户拥有的所有权限中(也就是$arry中)
        //如果当前请求的路由对应的控制器方法名$route在当前用户拥有的所有权限中(也就是$arry中),则继续请求页面
        if (in_array($route, $arr)) {               
            return $next($request);
        //否则当前请求的路由对应的控制器方法名$route不在当前用户拥有的所有权限中(也就是$arry中),则重定向到无权访问的页面
        } else {
            return redirect('noaccess');
        }
    }
}

3.创建无权访问的页面

  • 创建无权访问的路由
    Route::get('noaccess','Admin\LoginController@noaccess');
  • 创建无权访问的控制器方法
        //没有权限的跳转页面
        public function noaccess()
        {
            return view('errors.noaccess');
        }
  • 创建无权访问的模板
位置:resources/views/noaccess.blade.php
       <div class="content">
          <div class="title m-b-md">
              没有访问权限
           </div>
       </div>

4.注册中间件

      位置:app/Http/Kernel.php
          protected $routeMiddleware = [
              'hasRole' => \App\Http\Middleware\HasRole::class,
          ];

5.使用中间件

      //在需要访问的路由组中挂中间件'middleware' => ['hasRole']
      Route::group(['prefix' => 'admin', 'namespace' => 'Admin', 'middleware' => ['hasRole','isLogin']], function () {});
posted @ 2020-12-09 20:59  shengge  阅读(367)  评论(0)    收藏  举报