如何在 laravel 中使用中间件保护路由?

How to protect a route with middleware in laravel?

我的中间件有问题。当我以管理员身份登录时,它工作正常并重定向到 /Admin/home 与操作员相同(我有 2 个用户,管理员和操作员)。问题是当我点击 url 作为示例时:/Operator/home 作为管理员角色,它可以访问它。这就是问题所在。

我已经创建了一个新的中间件 CheckMiddleware,并在 $routeMiddleware 数组中注册到内核中作为 checkMiddleware:

public function handle($request, Closure $next)
    {
        $user = $request->user();

        if ($user) {
            if ($user->isAdmin()) {
                return $next($request);
            }elseif($user->isOperator()){
                return $next($request);
            }
        }

        return dd('Forbidden page. you have to login as admin/operator');
    }

在路线中:

Route::group(['prefix'=>'Admin' ,'middleware' => 'checkMiddleware'], function() {
    Route::get('/home', 'HomeController@index')->name('homeAdmin');
});

Route::group(['prefix'=>'Operator' ,'middleware' => 'checkMiddleware'], function() {
    Route::get('/home', 'HomeController@index')->name('homeAdmin');
});

Auth::routes();

在用户模型中:

public function isAdmin(){
        if ($this->role_id === 1) {
            return true;
        }

        return false;
    }

    public  function isOperator(){
        if ($this->role_id === 2) {
            return true;
        }

        return false;
    }

我想要的是,Admin 无法访问 Operator,Operator 无法访问 Admin。 如果不清楚,请告诉我你想看什么文件。

问题是如果 useradmin 那么接受请求并且 useroperator 仍然接受请求。下面的代码

if ($user->isAdmin()) {
    return $next($request);
}elseif($user->isOperator()){
    return $next($request);
}

对于简单的解决方案,只需为管理员和操作员创建两个中间件。然后为路由(组)应用admin中间件需要admin角色,为路由(组)应用operator中间件需要operator角色。

如果您有一些路由允许 adminoperator 角色访问,只需将两者添加到该路由即可。

更新 如果你想使用 1 个中间件,请这样做:

if ($user->isAdmin() && $request->route()->getPrefix() == 'admin') {
    return $next($request);
}
if ($user->isOperator() && $request->route()->getPrefix() == 'operator') {
    return $next($request);
}
return abort(401) // OR SOME ROUTE YOU WANT