繁体   English   中英

具有多种角色的 Laravel 中间件

[英]Laravel middleware with multiple roles

我遇到了 Laravel 中间件的一些问题。 让我告诉你我正在努力完成的基本思想:

网站上的注册用户将具有以下四个角色之一:

  1. 学生(默认):可以访问“索引”和“显示”视图
  2. 审批人:可以访问上一个,加上“概览”、“更新
  3. 编辑器:可以访问上一个,加上“创建”、“编辑”和“存储
  4. 管理员:可以访问所有内容

仅供参考:“概览”是一种索引视图,但仅适用于审批者角色及更高级别

你们有什么建议是最好的方法去做这件事? 这是我到目前为止所做的,但似乎不起作用:


内核.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');
}

“用户”雄辩模型:

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

这是对 fafich 回应的补充。

在 IF 中使用 in_array 而不是使用 FOREACH,如下所示:

if (! in_array($user->hasRole($role), $roles) {
 // returns if you dont have permission
}
return $next($request);

为每个登录会话请求完成您的处理功能

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM