Как проверить в компоненте Vue, аутентифицирован ли пользователь в Laravel?

Как говорится в заголовке, я немного смущен тем, как я буду использовать метод в моем компоненте Vue с помощью оператора if / else в зависимости от того, вошел ли пользователь в систему и аутентифицирован ли он с помощью фасада Laravel Auth. Я делаю различные запросы Axios, которые мне нужно разрешить / запретить в зависимости от того, вошел ли пользователь в систему.

У меня есть настройка VUEX, и я думал, что могу каким-то образом использовать локальное хранилище, чтобы иметь состояние для isLoggedin, например, которое работает с Laravel. Но я не знаю, правильный ли это метод или безопасный и, предположительно, Laravel уже хранит аутентификацию. Могу ли я просто получить доступ к этому напрямую во Vue?

Здесь есть какие-то нечистые решения, которые я не считаю лучшими - https://laracasts.com/discuss/channels/vue/hide-button-if-user-is-logged-with-laravel-and-vuejs

Не могу найти для этого примеров :(

Почему бы вам не использовать OAuth2 для аутентификации и не проверять, аутентифицирован ли пользователь по каждому запросу?

Dhaval Chheda 27.08.2018 19:11

Я думаю, что мог бы, но это немного продвинуто для моих целей и требует обучения.

Jquestions 29.08.2018 20:21
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Laravel Scout - это популярный пакет, который предоставляет простой и удобный способ добавить полнотекстовый поиск в ваше приложение Laravel. Он...
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
15
2
23 001
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

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

Обычно из вашего контроллера вы передаете объект аутентифицированного пользователя в представление, которое затем будет сохранено в переменной javascript.

Контроллер:

public function index()
{
    return view('index', [
        'auth_user' => Auth::user()
    ]);
}

Вы узнаете, аутентифицирован ли пользователь, если он возвращает объект, или null, где null означает, что ни один пользователь не аутентифицирован.

В вашем клинке назначьте auth_user переменной javascript:

<script>
    window.auth_user = {!! json_encode($auth_user); !!};
</script>

ваш объект хранилища vuex должен выглядеть как минимум так:

{
    state: {
        user: null
    },
    mutations: {
        setAuthUser(state, user) {
            state.user = user;
        }
    },
    getters: {
        isLoggedIn(state) {
            return state.user !== null;
        }
    }
}

Затем в корневом компоненте Vue возьмите auth_user и сохраните его в магазине:

<script>
    export default {

        mounted() {
            this.$store.commit('setAuthUser', window.auth_user);
        }

    }
</script>

Теперь у вас есть getter под названием this.$store.getters.isLoggedIn, который вы можете использовать в своем приложении для проверки того, вошел ли пользователь в систему в данный момент.

например:

Работает хорошо. Для справки мне пришлось использовать вместо window.auth_user = {!! json_encode($auth_user) !!};. Кроме того, мне пришлось вставить скрипт лезвия перед корневым главным компонентом Vue (в моем случае верхний колонтитул, а не нижний колонтитул)

Jquestions 04.08.2018 18:44

Но что, если клиент обновит свою страницу? Тогда он потеряет государство. Есть ли решение?

Bas 04.01.2019 06:13

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

Julian Paolo Dayag 06.01.2019 18:38

Извините за поздний вопрос. Что делать, если пользователь вышел из системы, но не обновляет страницу? Например, если сессия заканчивается.

raskalbass 30.04.2019 09:47

@raskalbass вам нужно реализовать способ обнаружения этого со стороны внешнего интерфейса. Один из способов - создать интервал, который проверяет сеанс каждые XX секунд / минут. Другой способ - добавить блок catch к вашему запросу ajax, который будет проверять, связана ли ошибка с истекшим сеансом.

Julian Paolo Dayag 08.05.2019 10:53

Это безопасно? @JulianPaoloDayag

Mayank Dudakiya 10.12.2019 12:00

@MayankDudakiya Я не совсем понимаю, что вы имели в виду под безопасностью. Технически говоря, во фронтальной части нет ничего безопасного. Этот метод предоставляет пользователю только глобальную переменную javascript для визуализированного вывода html, к которому вы затем можете получить доступ внутри своего приложения Vue. Пока вы не включаете в объект пользователя какую-либо конфиденциальную информацию, такую ​​как пароль, учетные данные карты и т. д., Тогда все будет в порядке.

Julian Paolo Dayag 18.04.2020 00:59

@JulianPaoloDayag Мы передаем неконфиденциальную информацию, поэтому она безопасна. Я не думаю, что требуется передавать какие-либо учетные данные с помощью этого метода. Если просто передать идентификатор пользователя, мы сможем получить любую информацию, связанную с пользователем, через API. Что скажешь?

Mayank Dudakiya 18.04.2020 19:32

вы также можете передать только идентификатор пользователя, если вы этого хотите. На самом деле вам решать, что вы передадите в переменную.

Julian Paolo Dayag 18.04.2020 21:25

Помещение скрипта в блейд-файл вызовет предупреждение Vue. Позвольте мне ответить «Как проверить в компоненте Vue, если пользователь аутентифицирован в Laravel» и оставлю вас с вашей сложностью Vuex. Также этот способ проще.

Итак, в вашем контроллере:

public function index()
{
    return view('index')->with('auth_user',  auth()->user());
}

В вашем клинке (main.blade.php):

<div class = "container">
    <example-component :auth_user='@json($auth_user)'></example-component>
</div>

В вашем vue-компоненте получите ваши реквизиты (ExampleComponent.vue):

<script>
export default {

  props: ['auth_user'],

  created () {
    console.info(this.auth_user)

  }
}
</script>

Возвращает null, если пользователь не вошел в систему

Используйте перехватчики Axios. Вы перехватываете код ответа HTTP с отказом в доступе и затем действуете соответствующим образом.

window.axios.interceptors.response.use(function (response) {
    return response;
}, function (error) {
    if (419 === error.response.status) {
         location.reload();
    } else {
        //Something else you want to do or do nothing
    }
});

Я работаю с laravel 7+ и ему не нужно отправлять Auth :: user () через контроллер Просто вызовите его из своего файла шаблона лезвия laravel, как показано ниже

ваше-имя-шаблона.blade.php

@if (Auth::check())
     <script>window.authUser = {!! json_encode(Auth::user()); !!};</script>
@else
     <script>window.authUser=null;</script>
@endif

внутри YourComponent.vue сохраните authUser следующим образом:

<script>
    export default {
         data() {
              return {
                   authUser: window.authUser
              }
          },

          created() {
                console.info(this.authUser);
          },

          methods: {
             yourMethodName() {
                  console.info(this.authUser);
          }
      }
 <script>

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