在 Laravel 中验证用户角色并保护路由
Posted
技术标签:
【中文标题】在 Laravel 中验证用户角色并保护路由【英文标题】:Authenticating a user role in Laravel and protecting a route 【发布时间】: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');
我不知道如何/在哪里/应该首先检查管理员角色,然后如何将其应用于身份验证检查以仅允许管理员访问路由。
任何帮助表示赞赏。
李
【问题讨论】:
【参考方案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
);
【讨论】:
谢谢你,我在错误的地方和顺序上有了正确的想法。以上是关于在 Laravel 中验证用户角色并保护路由的主要内容,如果未能解决你的问题,请参考以下文章