我正在嘗試撰寫一個測驗來驗證身份驗證中間件是否正在完成其作業。正如我下面的代碼清楚地表明的那樣,這個想法是get在未經過身份驗證的情況下向該中間件內部的路由發出請求,然后中間件應將我重定向到登錄視圖,并且我會在測驗結束時斷言我正在重定向。
但是正如錯誤(最后一個“代碼”)顯示的那樣,我的測驗不起作用,這是因為我的中間件什么也沒做(什么都沒有,我試過了dd(),echo等等),所以就好像我在發出get請求,實際上訪問路由回傳的視圖,而不被重定向到登錄視圖。
所以,如果我的代碼缺少一些配置,如果它是錯誤的,或者提供任何其他幫助,請有人解釋我。
我的中間件:
<?php
namespace App\Http\Middleware;
use Closure;
use Illuminate\Http\Request;
class AuthMiddleware
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure(\Illuminate\Http\Request): (\Illuminate\Http\Response|\Illuminate\Http\RedirectResponse) $next
* @return \Illuminate\Http\Response|\Illuminate\Http\RedirectResponse
*/
public function handle(Request $request, Closure $next)
{
if (!auth()->user()) {
return redirect(route('auth.get_login_view'), 301);
}
return $next($request);
}
}
核心:
protected $routeMiddleware = [
...
'authentication' => \App\Http\Middleware\AuthMiddleware::class,
];
我的路線:
Route::as('auth.')->group(function () {
Route::get('login', [AuthController::class, 'getUserTheLoginView'])->name('get_login_view');
Route::prefix('auth')->group(function () {
Route::post('login', [AuthController::class, 'loginUser'])->name('log_user');
});
});
Route::middleware('authentication')->group(function () {
Route::resources(['groups' => GroupsController::class]);
Route::resources(['users' => UsersController::class]);
});
我的測驗:
public function a_user_is_redirected_if_not_authenticated()
{
$this->withoutExceptionHandling();
$response = $this->get(route('cms.users.index'));
$response->assertRedirect();
}
錯誤:
? Tests\Feature\Cms\UsersTest > a user is redirected if not authenticated
Expected response status code [201, 301, 302, 303, 307, 308] but received 200.
Failed asserting that false is true.
at tests/Feature/Cms/UsersTest.php:23
19▕ $this->withoutExceptionHandling();
20▕
21▕ $response = $this->get(route('cms.users.index'));
22▕
? 23▕ $response->assertRedirect();
24▕ }
25▕
26▕ /** @test */
27▕ public function a_logged_user_can_create_another_user()
Tests: 1 failed
Time: 0.37s
uj5u.com熱心網友回復:
找到了解決方案。從 Laravel 9 開始,對我有用的方法是將中間件添加到我的路由中,如下所示。
現在,我不知道這是否更像是一種解決方法而不是解決方案,因為在 中注冊我的中間件Kernel.php并匯入它并使用它的類很奇怪。
...
use \App\Http\Middleware\AuthMiddleware;
...
Route::middleware(AuthMiddleware::class)->group(function () {
Route::resources(['groups' => GroupsController::class]);
Route::resources(['users' => UsersController::class]);
});
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/520705.html
