如何在 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。
如果不清楚,请告诉我你想看什么文件。
问题是如果 user
是 admin
那么接受请求并且 user
是 operator
仍然接受请求。下面的代码
if ($user->isAdmin()) {
return $next($request);
}elseif($user->isOperator()){
return $next($request);
}
对于简单的解决方案,只需为管理员和操作员创建两个中间件。然后为路由(组)应用admin
中间件需要admin
角色,为路由(组)应用operator
中间件需要operator
角色。
如果您有一些路由允许 admin
和 operator
角色访问,只需将两者添加到该路由即可。
更新
如果你想使用 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
我的中间件有问题。当我以管理员身份登录时,它工作正常并重定向到 /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。 如果不清楚,请告诉我你想看什么文件。
问题是如果 user
是 admin
那么接受请求并且 user
是 operator
仍然接受请求。下面的代码
if ($user->isAdmin()) {
return $next($request);
}elseif($user->isOperator()){
return $next($request);
}
对于简单的解决方案,只需为管理员和操作员创建两个中间件。然后为路由(组)应用admin
中间件需要admin
角色,为路由(组)应用operator
中间件需要operator
角色。
如果您有一些路由允许 admin
和 operator
角色访问,只需将两者添加到该路由即可。
更新 如果你想使用 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