Как говорится в заголовке, я немного смущен тем, как я буду использовать метод в моем компоненте 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
Не могу найти для этого примеров :(
Я думаю, что мог бы, но это немного продвинуто для моих целей и требует обучения.






Обычно из вашего контроллера вы передаете объект аутентифицированного пользователя в представление, которое затем будет сохранено в переменной 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 (в моем случае верхний колонтитул, а не нижний колонтитул)
Но что, если клиент обновит свою страницу? Тогда он потеряет государство. Есть ли решение?
После обновления страница определенно потеряет то состояние, в котором она была ранее, но в этом случае это не имеет значения. Приведенный выше код всегда будет гарантировать, что у вас есть user в вашем store, даже после того, как вы обновили страницу, поскольку код просто запустится снова.
Извините за поздний вопрос. Что делать, если пользователь вышел из системы, но не обновляет страницу? Например, если сессия заканчивается.
@raskalbass вам нужно реализовать способ обнаружения этого со стороны внешнего интерфейса. Один из способов - создать интервал, который проверяет сеанс каждые XX секунд / минут. Другой способ - добавить блок catch к вашему запросу ajax, который будет проверять, связана ли ошибка с истекшим сеансом.
Это безопасно? @JulianPaoloDayag
@MayankDudakiya Я не совсем понимаю, что вы имели в виду под безопасностью. Технически говоря, во фронтальной части нет ничего безопасного. Этот метод предоставляет пользователю только глобальную переменную javascript для визуализированного вывода html, к которому вы затем можете получить доступ внутри своего приложения Vue. Пока вы не включаете в объект пользователя какую-либо конфиденциальную информацию, такую как пароль, учетные данные карты и т. д., Тогда все будет в порядке.
@JulianPaoloDayag Мы передаем неконфиденциальную информацию, поэтому она безопасна. Я не думаю, что требуется передавать какие-либо учетные данные с помощью этого метода. Если просто передать идентификатор пользователя, мы сможем получить любую информацию, связанную с пользователем, через API. Что скажешь?
вы также можете передать только идентификатор пользователя, если вы этого хотите. На самом деле вам решать, что вы передадите в переменную.
Помещение скрипта в блейд-файл вызовет предупреждение 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>
Почему бы вам не использовать OAuth2 для аутентификации и не проверять, аутентифицирован ли пользователь по каждому запросу?