Laravel 5.7 - Как использовать Auth :: check (), даже если не используется промежуточное ПО для аутентификации

Я хочу создать маршрут API, который может вызываться как аутентифицированным пользователем, так и неаутентифицированным пользователем, и возвращать данные в зависимости от того, аутентифицирован ли пользователь.

Я застрял в использовании Auth :: check ().

Функция контроллера выглядит примерно так:

class SomeController extends Controller
{
    public function check(Request $request) {
        if (Auth::check()) {
            return response()->json([
                        'message' => 'Logged in'
                    ], 200);
        }
        else {
            return response()->json([
                        'message' => 'Not logged in'
                    ], 200);
        }
    }
}

У меня есть два сценария:

Сценарий 1

Route::get('scenario1', 'SomeController@check');

В этом сценарии в контроллере, когда я проверяю Auth :: check () внутри условия if, я всегда получаю ложное условие, независимо от того, аутентифицирован пользователь или нет.

Сценарий 2

Route::get('scenario2', 'SomeController@check')->middleware('auth:api');

В этом сценарии в контроллере, когда я проверяю Auth :: check (), я получаю истину, когда пользователь вошел в систему, и ошибку (Маршрут [вход] не определен), когда пользователь не вошел в систему.

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
2 693
3

Ответы 3

Что касается сценария 2, прочтите Защита маршрутов (и следующий подраздел «Перенаправление неаутентифицированных пользователей»).

При подключении промежуточного программного обеспечения auth к маршруту, если пользователь не аутентифицирован, он перенаправляется на маршрут с именем login, который вы не реализовали в своем приложении.


Но я не понял, почему auth работает в вашем сценарии 2, но не работает в вашем сценарии 1…

Я пытаюсь реализовать API, поэтому я не хочу перенаправлять, после вашего ответа я отредактировал Handler.php, чтобы он ответил объектом JSON с сообщением об ошибке «Unauthenticated». Итак, теперь я не получаю сообщение об ошибке «Маршрут [логин] не определен», а получаю сообщение об ошибке «Не прошел проверку подлинности». Это помогло мне получить более качественное сообщение об ошибке для неаутентифицированных пользователей, но проблема Auth :: check () все еще существует. Я хочу разрешить пользователям использовать этот маршрут независимо от того, аутентифицированы они или нет, и по-прежнему использовать фасад Auth.

ravsourabh 16.12.2018 10:04

Чтобы ответить на ваш прямой вопрос

How to use Auth::check() even when not using auth middleware

Вы просто используете Auth::check(). Промежуточное ПО Auth не означает, что у вас всегда есть доступ к классу Auth, это означает, что пользователь должен пройти аутентификацию для посещения / использования определенного маршрута.

Если у вас было промежуточное программное обеспечение auth на маршруте, а затем Auth::check на методе контроллера, который обрабатывал этот маршрут, это всегда было правдой, потому что промежуточное программное обеспечение остановило любого неаутентифицированного пользователя от достижения этой точки.

РЕДАКТИРОВАТЬ. Возможно, вам придется использовать группу промежуточного программного обеспечения для Интернета.

Это не мой опыт: использование Auth::check() возвращало null для аутентифицированного пользователя, когда маршрут не находился за промежуточным программным обеспечением Auth.

Robert Sinton 24.04.2021 03:02

Ответ здесь от Феликс Ева:

$user = Auth::guard('api')->user();

Это возвращает null, если пользователь не авторизован.

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