Laravel 具有多个角色的中间件
Laravel middleware with multiple roles
我 运行 遇到了 Laravel 中间件的一些问题。
让我告诉你我想要完成的事情的基本想法:
网站上的注册用户将具有四种角色之一:
- 学生(默认):可以访问“index”和“show”视图
- Approver: 可以访问previous, plus 'overview', 'update'
- Editor:可以访问上一个,加上'create','edit'和'store'
- 管理员:可以访问所有内容
仅供参考:'overview' 是一种索引视图,但仅适用于审批者角色和更高级别
你们建议最好的方法是什么?这是我到目前为止所做的,但它似乎不起作用:
Kernel.php
protected $middlewareGroups = [
...
'approver+' => [
\App\Http\Middleware\Approver::class,
\App\Http\Middleware\Editor::class,
\App\Http\Middleware\Admin::class,
],
];
protected $routeMiddleware = [
...
'student' => \App\Http\Middleware\Student::class,
'approver' => \App\Http\Middleware\Approver::class,
'editor' => \App\Http\Middleware\Editor::class,
'admin' => \App\Http\Middleware\Admin::class,
];
Http\Middleware\Admin.php
public function handle($request, Closure $next)
{
if (Auth::check())
{
if(Auth::user()->isAdmin())
{
return $next($request);
}
}
return redirect('login');
}
'User'Eloquent型号:
public function isAdmin()
{
if($this->role_id === 4)
{
return true;
}
else
{
return false;
}
}
我在 Approver 和 Editor 中间件文件中做了完全相同的操作,在 User 模型的 isApprover 和 isEditor 函数中,只是将 if 语句中的选中值分别编辑为 2 和 3。
最后,这是我在 routes\web 文件中所做的:
Route::get('scholen', 'SchoolsController@index');
Route::get('admin/scholen/overzicht', 'SchoolsController@overview')->middleware('approver+');
Route::get('admin/scholen/maken', 'SchoolsController@create')->middleware('approver+');
Route::post('scholen', 'SchoolsController@store')->middleware('approver+');
Route::get('scholen/{id}', 'SchoolsController@show');
Route::get('admin/scholen/{id}/bewerken', 'SchoolsController@edit')->middleware('admin');
Route::patch('admin/scholen/{id}', 'SchoolsController@update')->middleware('admin');
Route::delete('admin/scholen/{id}', 'SchoolsController@destroy')->middleware('admin');
这还不是完全正确,但我被卡住了,因为当我以具有批准者权限的用户身份登录并尝试访问学校概览时,它会将我重定向回主页。
总的来说,就是感觉自己工作太乱了,一点都不对劲,谁能给我一些建议,怎样才能更有效率?
非常感谢您!
您不应该为每个角色使用单独的中间件。它会很快变得非常混乱。最好有一个单一的角色检查中间件,可以检查传递给它的任何角色。
Http\Kernel.php
protected $routeMiddleware = [
...
'role' => \App\Http\Middleware\Role::class,
];
Http\Middleware\Role.php
public function handle($request, Closure $next, ... $roles)
{
if (!Auth::check()) // I included this check because you have it, but it really should be part of your 'auth' middleware, most likely added as part of a route group.
return redirect('login');
$user = Auth::user();
if($user->isAdmin())
return $next($request);
foreach($roles as $role) {
// Check if user has the role This check will depend on how your roles are set up
if($user->hasRole($role))
return $next($request);
}
return redirect('login');
}
终于在您的网络路线中
Route::get('admin/scholen/overzicht', 'SchoolsController@overview')->middleware('role:editor,approver');
Route::get('admin/scholen/{id}/bewerken', 'SchoolsController@edit')->middleware('role:admin');
为每个登录会话请求完成处理函数
public function handle($request, Closure $next)
{
if (! Auth::check()) {
return redirect()->route('login');
}
if (Auth::user()->role == 1) {
return redirect()->route('superadmin');
}
if (Auth::user()->role == 5) {
return redirect()->route('academy');
}
if (Auth::user()->role == 6) {
return redirect()->route('scout');
}
if (Auth::user()->role == 4) {
return redirect()->route('team');
}
if (Auth::user()->role == 3) {
return $next($request);
}
if (Auth::user()->role == 2) {
return redirect()->route('admin');
}
}
这是对 fafich 回复的补充。
在 IF 中使用 in_array 而不是使用 FOREACH,如下所示:
if (! in_array($user->hasRole($role), $roles) {
// returns if you dont have permission
}
return $next($request);
我 运行 遇到了 Laravel 中间件的一些问题。 让我告诉你我想要完成的事情的基本想法:
网站上的注册用户将具有四种角色之一:
- 学生(默认):可以访问“index”和“show”视图
- Approver: 可以访问previous, plus 'overview', 'update'
- Editor:可以访问上一个,加上'create','edit'和'store'
- 管理员:可以访问所有内容
仅供参考:'overview' 是一种索引视图,但仅适用于审批者角色和更高级别
你们建议最好的方法是什么?这是我到目前为止所做的,但它似乎不起作用:
Kernel.php
protected $middlewareGroups = [
...
'approver+' => [
\App\Http\Middleware\Approver::class,
\App\Http\Middleware\Editor::class,
\App\Http\Middleware\Admin::class,
],
];
protected $routeMiddleware = [
...
'student' => \App\Http\Middleware\Student::class,
'approver' => \App\Http\Middleware\Approver::class,
'editor' => \App\Http\Middleware\Editor::class,
'admin' => \App\Http\Middleware\Admin::class,
];
Http\Middleware\Admin.php
public function handle($request, Closure $next)
{
if (Auth::check())
{
if(Auth::user()->isAdmin())
{
return $next($request);
}
}
return redirect('login');
}
'User'Eloquent型号:
public function isAdmin()
{
if($this->role_id === 4)
{
return true;
}
else
{
return false;
}
}
我在 Approver 和 Editor 中间件文件中做了完全相同的操作,在 User 模型的 isApprover 和 isEditor 函数中,只是将 if 语句中的选中值分别编辑为 2 和 3。
最后,这是我在 routes\web 文件中所做的:
Route::get('scholen', 'SchoolsController@index');
Route::get('admin/scholen/overzicht', 'SchoolsController@overview')->middleware('approver+');
Route::get('admin/scholen/maken', 'SchoolsController@create')->middleware('approver+');
Route::post('scholen', 'SchoolsController@store')->middleware('approver+');
Route::get('scholen/{id}', 'SchoolsController@show');
Route::get('admin/scholen/{id}/bewerken', 'SchoolsController@edit')->middleware('admin');
Route::patch('admin/scholen/{id}', 'SchoolsController@update')->middleware('admin');
Route::delete('admin/scholen/{id}', 'SchoolsController@destroy')->middleware('admin');
这还不是完全正确,但我被卡住了,因为当我以具有批准者权限的用户身份登录并尝试访问学校概览时,它会将我重定向回主页。
总的来说,就是感觉自己工作太乱了,一点都不对劲,谁能给我一些建议,怎样才能更有效率?
非常感谢您!
您不应该为每个角色使用单独的中间件。它会很快变得非常混乱。最好有一个单一的角色检查中间件,可以检查传递给它的任何角色。
Http\Kernel.php
protected $routeMiddleware = [
...
'role' => \App\Http\Middleware\Role::class,
];
Http\Middleware\Role.php
public function handle($request, Closure $next, ... $roles)
{
if (!Auth::check()) // I included this check because you have it, but it really should be part of your 'auth' middleware, most likely added as part of a route group.
return redirect('login');
$user = Auth::user();
if($user->isAdmin())
return $next($request);
foreach($roles as $role) {
// Check if user has the role This check will depend on how your roles are set up
if($user->hasRole($role))
return $next($request);
}
return redirect('login');
}
终于在您的网络路线中
Route::get('admin/scholen/overzicht', 'SchoolsController@overview')->middleware('role:editor,approver');
Route::get('admin/scholen/{id}/bewerken', 'SchoolsController@edit')->middleware('role:admin');
为每个登录会话请求完成处理函数
public function handle($request, Closure $next)
{
if (! Auth::check()) {
return redirect()->route('login');
}
if (Auth::user()->role == 1) {
return redirect()->route('superadmin');
}
if (Auth::user()->role == 5) {
return redirect()->route('academy');
}
if (Auth::user()->role == 6) {
return redirect()->route('scout');
}
if (Auth::user()->role == 4) {
return redirect()->route('team');
}
if (Auth::user()->role == 3) {
return $next($request);
}
if (Auth::user()->role == 2) {
return redirect()->route('admin');
}
}
这是对 fafich 回复的补充。
在 IF 中使用 in_array 而不是使用 FOREACH,如下所示:
if (! in_array($user->hasRole($role), $roles) {
// returns if you dont have permission
}
return $next($request);