【问题标题】:Authenticating a user role in Laravel and protecting a route在 Laravel 中验证用户角色并保护路由
【发布时间】:2014-07-18 03:08:14
【问题描述】:

我听取了这里的人的建议并尝试了 Laravel,我一直在尝试创建一个用户身份验证系统。我无法使用 Eloquent 将我知道的 PHP 中的内容翻译成 Laravel。

我在这里要做的是识别用户,他们的角色,如果用户具有管理员角色,他们可以访问路由 /admin

我知道我可以使用 Entrust 等软件包,但这并不能真正帮助我学习。

我已经为用户和角色创建了模型。我还有一个名为 role_user 的查找表,其中包含 user_id 和 role_id。

User.php 我有

public function roles(){

    return $this->belongsToMany('Role', 'users_roles');

}

Role.php 我有

public function users()
{
    return $this->belongsToMany('User', 'users_roles');
}

我知道我是否使用过

$roles = user::find(1)->roles;
return ($roles);

它将并且确实返回正确的用户 ID (1) 和分配给该用户的角色。现在我正在努力的是如何选择管理员角色,只有当用户拥有这个角色时,它才会允许访问 /admin

路线本质上应该是

Route::get('admin', function()
{

    return View::make('admin.index');

 })->before('auth');

我不知道如何/在哪里/应该首先检查管理员角色,然后如何将其应用于身份验证检查以仅允许管理员访问路由。

任何帮助表示赞赏。

【问题讨论】:

    标签: authentication laravel roles laravel-routing


    【解决方案1】:

    对于 Laravel 5,使用 Middleware:

    创建新的中间件

    # php artisan make:middleware RoleMiddleware
    

    检查用户角色 - 如果角色无效则重定向

    // app/Http/Middleware/RoleMiddleware.php
    
    class RoleMiddleware
    {
        public function handle($request, Closure $next, $role)
        {
            if (! $request->user()->hasRole($role)) {
                // Redirect...
            }
    
            return $next($request);
        }
    }
    

    添加键以分配给路由 - 也可以使全局

    // app/Http/Kernel.php
    
    protected $routeMiddleware = [
        'auth' => \App\Http\Middleware\Authenticate::class,
        'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
        'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
        'role' => \App\Http\Middleware\RoleMiddleware::class, // new
    ];
    

    保护路线

    // app/Http/routes.php
    
    Route::put('post/{id}', ['middleware' => 'role:editor', function ($id) {
        // routes for editor
    }]);
    

    【讨论】:

      【解决方案2】:

      您已使用auth 过滤器,因此您应该检查app/filters.php 文件中的auth 过滤器:

      Route::filter('auth', function($route, $request)
      {
          // Login check (Default)
          if (Auth::guest()) return Redirect::guest('login');
      
          // Admin check
          if(!in_array('admin', Auth::user()->roles->toArray())) {
              return Redirect::to('/'); // Redirect home page
          }
      
      });
      

      您可以使用不同的过滤器,例如:

      Route::get('admin', function()
      {
          return View::make('admin.index');
      
      })->before('isAdmin');
      

      app/filters.php 中声明自定义isAdmin 过滤器:

      Route::filter('isAdmin', function($route, $request)
      {
          if(!Auth::check()) return Redirect::guest('login');
          if( !in_array('admin', Auth::user()->roles->toArray()) ) {
              return Redirect::to('/'); // Redirect home page
          }
      
      });
      

      【讨论】:

      • 谢谢你,我在错误的地方和顺序上有了正确的想法。
      猜你喜欢
      • 2020-05-10
      • 2017-05-15
      • 1970-01-01
      • 2013-05-16
      • 2021-11-12
      • 2018-06-30
      • 2019-10-28
      • 2021-03-11
      • 2013-12-11
      相关资源
      最近更新 更多