在Laravel中验证用户角色并保护路由

时间:2014-05-28 18:33:43

标签: authentication laravel roles laravel-routing

我已经从这里的人那里得到了建议并尝试了Laravel,我一直在尝试创建一个用户身份验证系统。我无法使用Eloquent将我在PHP中工作的内容翻译成Laravel。

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

我知道我可以使用像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');

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

任何帮助表示感谢。

2 个答案:

答案 0 :(得分:5)

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

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

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

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
    }

});

答案 1 :(得分:5)

对于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
}]);