Laravel — Усиление защиты для различных маршрутов и модульных тестов

В настоящее время я разрабатываю модульный тест для своих маршрутов и столкнулся со странной ситуацией.

У меня есть несколько маршрутов, которые я создал в файле 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.

Как мне объявить свои маршруты, чтобы они использовали правильную защиту?

Я бы посоветовал не использовать request() у поставщиков услуг. Нет никакой гарантии, что поставщик услуг будет зарегистрирован или даже загружен после инициирования запроса (даже если это так в настоящее время, это не гарантируется в будущем, и если вы переключитесь на использование, например, поставщиков услуг Octane, они регистрируются и загружаются один раз и не по каждому запросу)

apokryfos 17.03.2024 16:12

@apokryfos Да, именно так. Я хочу прекратить использовать эту штуку с запросами.

NeebletWorm 17.03.2024 16:25
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
2
208
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Возможно что-то подобное в 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?

NeebletWorm 18.03.2024 15:41

Извините за поздний ответ, вы можете проверить изменение использования аутентификации внутри контроллера. Надеюсь, это сработает :D

PhantomPhreak1995 19.03.2024 09:22

Другие вопросы по теме