Laravel 8:自定义中间件似乎无法正常工作
Laravel 8: Custom Middleware Does Not Seem To Be Working
我正在为我的项目和这个项目使用 Laravel 8,我创建了一个名为 Admin
的自定义中间件,它是这样的:
public function handle(Request $request, Closure $next)
{
if (Auth::check()) {
if (Auth::user()->isAdmin()) {
return $next($request);
}
}
return redirect('/');
}
我试过这样应用它:
Route::group(['middleware' => 'admin'], function() {
Route::resource('admin/users', App\Http\Controllers\Admin\AdminUserController::class);
});
在 Kernel.php
上:
'admin' => \App\Http\Middleware\Admin::class
所以我在用户模型中调用了isAdmin()
,它只是检查用户的角色是否正确:
public function roles()
{
return $this->belongsToMany(Role::class);
}
public function isAdmin()
{
foreach ($this->roles as $role) {
if ($role->name == 'Manual User') {
return true;
}
}
return false;
}
目前,我有这两个角色:
我要登录的用户设置为 6 并且角色 ID 为 1 Manual User
:
但现在的问题是,当我转到 /admin/users
uri 时,它不会将我重定向到 ('/')
uri 并显示 /admin/users
页面!
那么这里出了什么问题?我该如何解决这个问题?
请注意,roles
和 users
之间的多对多关系很好,无需提及。
我在本地使用非常相似的设置进行了尝试,没有遇到任何问题。我冒昧地 changing/simplifying 一些事情。
这些是我采取的步骤。
1。中间件
1.1。创建 Admin
个中间件。
通过 运行 php artisan make:middleware Admin
命令完成。
1.2。填写中间件
<?php
namespace App\Http\Middleware;
use Closure;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
class Admin
{
/**
* Passes if authenticated user is an admin.
*
* @see App\Models\User::isAdmin()
*/
public function handle(Request $request, Closure $next)
{
if (Auth::user()->isAdmin()) {
return $next($request);
}
return redirect('/');
}
}
这是我的第一个改变:我不做 Auth::check()
。还有另一个中间件。
1.3 在 App\Http\Kernel.php
中向 $middlewareGroups
添加新条目。
protected $middlewareGroups = [
'web' => [...],
'api' => [...],
// check if user is authenticated, then check if it's an admin
'admin' => [
'auth',
\App\Http\Middleware\Admin::class
],
];
protected $routeMiddleware = [
'auth' => \App\Http\Middleware\Authenticate::class,
...
];
2。路线
添加一个使用上面创建的中间件的路由。
Route::middleware('admin')->group(function () {
Route::get('test', function () { return "User is authenticated and is an admin."; });
});
另外,您可以选择简化 isAdmin()
方法。
public function isAdmin()
{
return $this->roles->contains('name', 'Manual User');
}
这对我来说已经达到了预期的效果。您确定 App\Http\Kernel.php
文件编辑正确吗?
我正在为我的项目和这个项目使用 Laravel 8,我创建了一个名为 Admin
的自定义中间件,它是这样的:
public function handle(Request $request, Closure $next)
{
if (Auth::check()) {
if (Auth::user()->isAdmin()) {
return $next($request);
}
}
return redirect('/');
}
我试过这样应用它:
Route::group(['middleware' => 'admin'], function() {
Route::resource('admin/users', App\Http\Controllers\Admin\AdminUserController::class);
});
在 Kernel.php
上:
'admin' => \App\Http\Middleware\Admin::class
所以我在用户模型中调用了isAdmin()
,它只是检查用户的角色是否正确:
public function roles()
{
return $this->belongsToMany(Role::class);
}
public function isAdmin()
{
foreach ($this->roles as $role) {
if ($role->name == 'Manual User') {
return true;
}
}
return false;
}
目前,我有这两个角色:
我要登录的用户设置为 6 并且角色 ID 为 1 Manual User
:
但现在的问题是,当我转到 /admin/users
uri 时,它不会将我重定向到 ('/')
uri 并显示 /admin/users
页面!
那么这里出了什么问题?我该如何解决这个问题?
请注意,roles
和 users
之间的多对多关系很好,无需提及。
我在本地使用非常相似的设置进行了尝试,没有遇到任何问题。我冒昧地 changing/simplifying 一些事情。
这些是我采取的步骤。
1。中间件
1.1。创建 Admin
个中间件。
通过 运行 php artisan make:middleware Admin
命令完成。
1.2。填写中间件
<?php
namespace App\Http\Middleware;
use Closure;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
class Admin
{
/**
* Passes if authenticated user is an admin.
*
* @see App\Models\User::isAdmin()
*/
public function handle(Request $request, Closure $next)
{
if (Auth::user()->isAdmin()) {
return $next($request);
}
return redirect('/');
}
}
这是我的第一个改变:我不做 Auth::check()
。还有另一个中间件。
1.3 在 App\Http\Kernel.php
中向 $middlewareGroups
添加新条目。
protected $middlewareGroups = [
'web' => [...],
'api' => [...],
// check if user is authenticated, then check if it's an admin
'admin' => [
'auth',
\App\Http\Middleware\Admin::class
],
];
protected $routeMiddleware = [
'auth' => \App\Http\Middleware\Authenticate::class,
...
];
2。路线
添加一个使用上面创建的中间件的路由。
Route::middleware('admin')->group(function () {
Route::get('test', function () { return "User is authenticated and is an admin."; });
});
另外,您可以选择简化 isAdmin()
方法。
public function isAdmin()
{
return $this->roles->contains('name', 'Manual User');
}
这对我来说已经达到了预期的效果。您确定 App\Http\Kernel.php
文件编辑正确吗?