Laravel 5.3保护用户路由具有不同的角色

时间:2017-01-01 05:38:09

标签: php laravel routes laravel-5.3

问题

我正在寻找一种方法来保护用户免受不属于他们的访问路由,例如管理员无法访问用户区域,简单用户无法访问管理区域

嗨,我有一个laravel 5.3应用程序,它有两种类型的用户

  1. 管理
  2. 简单用户
  3. 我试图阻止admin访问simple user路由,反之亦然,我搜索了很多,找到了一个创建中间件的解决方案

    我做了什么

    <?php
    
    namespace App\Http\Middleware;
    
    use Auth;
    
    use Closure;
    
    class UserRole
    {
        /**
         * Handle an incoming request.
         *
         * @param  \Illuminate\Http\Request  $request
         * @param  \Closure  $next
         * @return mixed
         */
        public function handle($request, Closure $next)
        {
            if ( Auth::check()) // user logged
            {
                $request_url = $request->getRequestUri();
                if( Auth::user()->user_type == 1 ) // simple user
                {
                    // checking if simple user is visiting routes              // starts with /user in the url 
                    if (strpos($request_url, "/user") === 0)
                    {
                        return $next($request);
                    }
                    else
                    {
                        return redirect('/');
                    }
                }
                // checking if admin is visiting routes                    // starts with /admin in the url
                else if( Auth::user()->user_type == 2 ) // admin
                {
                    if (strpos($request_url, "/admin") === 0)
                    {
                        return $next($request);
                    }
                    else
                    {
                        return redirect('/');
                    }
                }
                else
                {
                    return redirect('/');
                }
            }
            return redirect('/');
        }
    }
    
    不幸的是,两人都能够访问彼此禁区。我无法找到更好的方法来保护用户免于访问他们也无法访问的路由。

1 个答案:

答案 0 :(得分:0)

如果您想使用中间件实现这一目标,则需要执行以下操作 -

  
      
  1. 创建两个中间件,一个用于管理员,一个用于简单用户。

  2.   
  3. 然后在路线文件中创建两个路线组,即routes/web.php

  4.   
  5. 使用 admin 中间件保护一个路由组,并将所有与管理员相关的路由放入该组。保护另一个路线组   同   简单用户中间件,并将所有与管理员相关的路由放入该组中。

  6.   
Route::group(['middleware' => ['auth', 'admin']], function() {
    // put all your admin routes here
});

Route::group(['middleware' => ['auth', 'simple-user']], function() {
    // put all your simple user routes here
});

您还可以使用角色和权限来完成此操作。这是一个可以满足您需求的包。

https://packagist.org/packages/zizaco/entrust