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



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

我已经创建了一个新的中间件CheckMiddleware,并将数组$routeMiddleware中的内核注册为检查中间件:

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

我想要的是,管理员无法访问操作员,操作员无法访问管理员。如果不清楚,请告诉我您想查看哪个文件。

问题是,如果user admin则接受请求,user operator仍然接受请求。下面的代码

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

最新更新