В настоящее время я разрабатываю модульный тест для своих маршрутов и столкнулся со странной ситуацией.
У меня есть несколько маршрутов, которые я создал в файле Routes/fortify.php.
Некоторые из этих маршрутов используют другой fortify.guard (администратор и пользователь не имеют доступа к одним и тем же страницам).
Для этого я написал это в классе FortifyServiceProvider:
/**
* Register any application services.
*/
public function register(): void
{
Fortify::ignoreRoutes();
if (request()->is('api/v1/admin/*')){
config()->set('fortify.guard', 'admin');
}
}
Теперь, когда я запускаю php artisan test, это больше не работает, поскольку маршрут request() — GET/ (это я не знаю почему.)
Смотрите код моего теста ниже:
public function loginAsTestAdmin(): void
{
$payload = ['email' => '[email protected]', 'password' => bcrypt('password')];
$this->post('api/v1/admin/login', $payload)->assertStatus(200);
}
При вызове этого маршрута тест if (request()->is('api/v1/admin/*')) завершается неудачей, и, следовательно, охранник пытается получить модель «Пользователь» вместо модели «Администратор» в базе данных, что приводит к сбою аутентификации (поскольку пользователь с адресом электронной почты «[email protected]» не существует). ).
Итак, я понял, что динамическое изменение конфигурации для установки правильной защиты, вероятно, не является способом сделать это в Laravel.
Как мне объявить свои маршруты, чтобы они использовали правильную защиту?
@apokryfos Да, именно так. Я хочу прекратить использовать эту штуку с запросами.






Возможно что-то подобное в config/auth.php
'guards' => [
'admin' => [
'driver' => 'session',
'provider' => 'admins',
],
'web' => [
'driver' => 'session',
'provider' => 'users',
],
],
и в маршрутах/fortify.php:
Route::middleware(['auth:admin'])->group(function () {
// routes protected by the admin guard, for example
Route::post('api/v1/admin/login', [\App\Http\Controllers\AdminLoginController::class, 'login']);
});
Route::middleware(['auth'])->group(function () {
// routes protected by the default guard or user guard
});
Таким образом, вам не нужно динамически менять охрану, вы просто указываете охрану для каждого маршрута или группы маршрутов.
Вот как вы проходите аутентификацию с помощью защиты администратора.
Auth::guard('admin')->attempt($credentials);
Вот как вы можете получить доступ к аутентифицированному пользователю, чтобы вы могли использовать объект или данные пользователя:
$user = Auth::guard('admin')->user();
И не забывайте использовать:
use Illuminate\Support\Facades\Auth;
Абсолютный спасатель жизни, спасибо, чувак. Я попробую это и проверю ответ, если он сработает. Обновлено: Как вы указываете защиту внутри Admin LoginController?
Извините за поздний ответ, вы можете проверить изменение использования аутентификации внутри контроллера. Надеюсь, это сработает :D
Я бы посоветовал не использовать
request()у поставщиков услуг. Нет никакой гарантии, что поставщик услуг будет зарегистрирован или даже загружен после инициирования запроса (даже если это так в настоящее время, это не гарантируется в будущем, и если вы переключитесь на использование, например, поставщиков услуг Octane, они регистрируются и загружаются один раз и не по каждому запросу)