Как проверить авторизирован ли пользователь? Django
Если пользуетесь TemplateView , то можно так переопределить базовый метод:
class ProfilePage(TemplateView): template_name = 'home_user_page.html' def dispatch(self, request, *args, **kwargs): if request.user.is_authenticated == True: # Try to dispatch to the right method; if a method doesn't exist, # defer to the error handler. Also defer to the error handler if the # request method isn't on the approved list. if request.method.lower() in self.http_method_names: handler = getattr(self, request.method.lower(), self.http_method_not_allowed) else: handler = self.http_method_not_allowed return handler(request, *args, **kwargs) else: return redirect("login")
Как проверить авторизован ли пользователь в приложении на Vue?
Делаю приложение и столкнулся с следующей задачей:
Скажем есть пункт меню «Профиль»
есть два представления данной страницы:
LoginPage — страница авторизации(регистрации)
ProfilePage — страница авторизованного пользователя с его данными
Как проверить авторизован ли пользователь в приложении или нет?
и в зависимости от ответа выдавать то или иное представление.
подозреваю что это нужно делать средством beforeEnter в path: ‘/profile’, component: ProfileViewsPage
- Вопрос задан более трёх лет назад
- 5148 просмотров
Комментировать
Решения вопроса 2

Evgeny Kulakov @kulakoff Куратор тега Vue.js
Vue.js developing
Мне кажется у вас не совсем верный подход, что если у вас будет множество путей, которые требуют авторизации? Один из вариантов добавить в роутер информацию требует данная страница авторизации или нет:
Информация о том, что авторизован пользователь или нет должна сохраняться например в localStorage.
Далее в beforeEnter проверяете для страницы, на которую осуществляется переход, требуется ли авторизация для нее. Если да, то смотрим в localStorage, проверяем авторизован ли пользователь, если да, то переходим на страницу, если нет, то отправляем его на страницу авторизации. После успешной авторизации сохраняем, что пользователь авторизован в localStorage.
Также добавятся дополнительные условия, когда у вас протухает токен, по которому вы общаетесь с бэкендом.
Ответ написан более трёх лет назад
Нравится 1 3 комментария

Николай Семенов @nickola105 Автор вопроса
Сделал вот такую реализацию:
на странице профиля
export default < computed: < . mapGetters(< user: 'user' >) >, methods: < logOut() < this.$http.post('logout', < >) .then( response => < console.log(response); >, error => < console.log(error); >); localStorage.setItem('userAuth', 'no'); this.$router.push('/login') > >, beforeRouteEnter(from, to, next) < const userAuth = localStorage.getItem('userAuth'); //debugger if (userAuth === "yes") < next() >else < next('/login') >> >
на странице логин
export default < data() < return < user: < username: '', password: '' >, userAuth: '' >; >, methods: < logIn() < this.$http.post('auth', ,) .then( response => < this.userAuth = response.body; if (response.body === 'done') < localStorage.setItem('userAuth', 'yes') this.$router.push('/profile') >else < >console.log(response); >, error => < console.log(error); >); > > >
не совсем понял зачем в этой реализации
path: '/profile', component: ProfilePage requiresAuth: true,
все работает вроде без нее
Вроде все работает, но просьба к вам оценить профессионально

Evgeny Kulakov @kulakoff Куратор тега Vue.js
Так прокатит, если у вас только страница, которая для захода требует прав доступа, иначе в каждой придется писать вот это кусок:
beforeRouteEnter(from, to, next) < const userAuth = localStorage.getItem('userAuth'); //debugger if (userAuth === "yes") < next() >else < next('/login') >>
Нужно использовать глобальный хук beforeRouteEnter, и в нем каждый маршрут смотреть можно ли на него зайти без авторизации/с авторизацией
Определить, залогинен ли пользователь в FB/VK/G+/.
Задумался тут, а нельзя ли на своём сайте определить, залогинен ли пользователь в одной из популярных социальных сетей? Чтобы просто подсунуть ему родную для него форму ответа, провоцировать на комментарий 🙂
Как-то традиционно считаю, что нет. Куки чужие недоступны, приходит он с левым реферером и т.п.
Но, вдруг? Ведь фактически требуется только узнать, авторизован ли он в соц. сети, приватных данных не нужно. Уже при ответе его можно будет направить на OAuth.
Может, у кого-то в API такое есть? Или ещё как-то?

KRoN73 ★★★★★
23.12.12 23:08:22 MSK

Быстрый гуглинг привел к следующим результатам, однако я сам не тестировал:
Boba_Fett ★
( 24.12.12 01:49:57 MSK )

По идее, до обращения к API OAuth ты должен будешь получить токен, который ты получишь после того как юзер даст согласие на требуемом ресурсе, т.е. без участия юзера этого не сделать.
Reaper ★★
( 24.12.12 01:53:53 MSK )

Ага, xss называется ^___^
tazhate ★★★★★
( 24.12.12 01:54:42 MSK )
Ответ на: комментарий от Boba_Fett 24.12.12 01:49:57 MSK

Хм. Интересный подход, мне в голову не приходил. Годится. Надо будет применить 🙂
KRoN73 ★★★★★
( 24.12.12 01:56:03 MSK ) автор топика
Ответ на: комментарий от Reaper 24.12.12 01:53:53 MSK

По идее, до обращения к API OAuth ты должен будешь получить токен, который ты получишь после того как юзер даст согласие на требуемом ресурсе, т.е. без участия юзера этого не сделать.
Это уже второй этап и там по полной программе надо будет работать. Тут именно вопрос в определении соц. сети, в которой работает юзер, чтобы сразу направлять его туда без лишних сущностей в виде выбора сети.
Т.е. человек читает материал, видит форму ответа и комментарий, типа, «При ответе сообщение будет отправлено от вашего имени в такой-то соц-сети».
Или даже вообще подсунуть родную форму ответа от соц. сети, где уже цивильно, с именем и аватаркой всё будет.
KRoN73 ★★★★★
( 24.12.12 01:59:52 MSK ) автор топика

А статус разве не всем доступен? У контакта судя по апи (см online в fields) вроде можно получить. В крайнем случае можно страницу распарсить в качестве костыля.
Kalashnikov ★★★
( 24.12.12 09:34:14 MSK )
Ответ на: комментарий от KRoN73 24.12.12 01:59:52 MSK

может проще просить их войти через соцсеть и по этому ориентироваться?
trashymichael ★★★
( 24.12.12 11:58:10 MSK )
Ответ на: комментарий от trashymichael 24.12.12 11:58:10 MSK

может проще просить их войти через соцсеть и по этому ориентироваться?
Хорошо, если процентов 10 посетителей на это пойдут. А, скорее всего, и того меньше будет 🙂
А вот когда у тебя в комментариях висит открытая форма ответа, да ещё и с твоей мордой на аватаре, то это очень должно стимулировать.
KRoN73 ★★★★★
( 24.12.12 14:41:20 MSK ) автор топика

Если найдешь решение — отпишись пожалуйста. Очень интересная идея.
drakmail ★★★★
( 24.12.12 16:03:11 MSK )
Ответ на: комментарий от Kalashnikov 24.12.12 09:34:14 MSK
Пользователь может быть залогиненым в браузере на другом компьютере или на телефоне
bhfq ★★★★★
( 24.12.12 16:07:54 MSK )
Ответ на: комментарий от drakmail 24.12.12 16:03:11 MSK

Чтобы определить сам факт логина, анонимус выше вполне рабочее решение предложил (по ссылкам). По крайней мере у автора по первым ссылкам мой статус логина определился верно 🙂
Так и буду делать. Первый этап, подсунуть форму ответов от выбранной соц.сети, в теории готов.
На практике потом ещё бы неплохо комментарии из этой соц. сети вытаскивать и уже у себя прямо использовать. Тут надо будет ещё покопать, видимо.
Либо, что лучше, сразу использовать автору авторизацию по OpenID (тем более, что он уже залогинен, ему только одно лишнее нажатие надо будет сделать, подтвердив разрешение доступа к своим данным). Но тут минус в том, что в таком варианте до подтверждения авторизации пользователем его аватарка может быть недоступна, снижая привлекательность формы ответа 🙂 В общем, есть ещё над чем подумать.
KRoN73 ★★★★★
( 24.12.12 16:12:38 MSK ) автор топика
Ответ на: комментарий от KRoN73 24.12.12 16:12:38 MSK

О, отлично! Именно проверка статуса логина и нужна была.
drakmail ★★★★
( 24.12.12 16:22:53 MSK )
Ответ на: комментарий от bhfq 24.12.12 16:07:54 MSK

Так ТС нужно определить какую социалку он юзает же, всё нормально.
Меня кстати это скорее оттолкнёт, я бы в первый раз предлагал выбрать что нужно, а потом бы запоминал. Можно ещё в первый раз дефолтом контактик подсунуть, всё ранво он популярней всего в рашке.
Kalashnikov ★★★
( 24.12.12 16:29:23 MSK )
Ответ на: комментарий от Kalashnikov 24.12.12 16:29:23 MSK

Меня кстати это скорее оттолкнёт, я бы в первый раз предлагал выбрать
Ну так возможность выбрать я оставлю 🙂 Тут именно ориентация на тех, кому лениво выбирать. На большинство.
Можно ещё в первый раз дефолтом контактик подсунуть, всё ранво он популярней всего в рашке.
Но человек может быть там не залогинен, а зайти прямо с того же Фейсбука.
KRoN73 ★★★★★
( 24.12.12 16:35:27 MSK ) автор топика
Ответ на: комментарий от Kalashnikov 24.12.12 16:29:23 MSK
Я считаю это не нужной тратой времени, например я могу быть залогиненым в facebook так как вечно туда кто-то что-то пишет. А в твиттере я не сижу, я его использую как раз для таких вот авторизаций на сайтах или google аккаунт (если нет твиттера), но самим google+ я не пользуюсь.
bhfq ★★★★★
( 24.12.12 16:41:46 MSK )
Ответ на: комментарий от bhfq 24.12.12 16:41:46 MSK

потому предлагать выбирать наиболее правильное решения, у меня тоже браузер залогинен во все эти социалки, но это ничего не значит
trashymichael ★★★
( 24.12.12 16:51:36 MSK )

У контактега же есть родное API для комментирования с возможностью запостить себе на стену.
Там автоматом определяется, залогинен ты, или нет.
Или это не то, что надо?
Насчет других соц. сетей не знаю.
solovey ★★
( 25.12.12 16:44:10 MSK )
Ответ на: комментарий от solovey 25.12.12 16:44:10 MSK

Нет, не то. Чтобы задействовать VK, нужно заранее уже знать, что посетитель использует именно VK, а не FB или G+.
KRoN73 ★★★★★
( 25.12.12 16:45:27 MSK ) автор топика
Ответ на: комментарий от KRoN73 25.12.12 16:45:27 MSK

А, блин, я не внимательно читаю.
solovey ★★
( 25.12.12 17:00:07 MSK )
Ответ на: комментарий от KRoN73 24.12.12 16:12:38 MSK

На практике потом ещё бы неплохо комментарии из этой соц. сети вытаскивать и уже у себя прямо использовать. Тут надо будет ещё покопать, видимо.
Обязательно нужно использовать их комментарии? А если сохранять их у себя с указанием с какой соц. сети писали? Что-то похожее я видел на некоторых сайтах. Одна форма ввода комментария с выбором от какой учетной записи соц. сети писать. Только теперь не могу найти эти сайты, чтобы проверить (как раз сам думал над таким способом для одного своего проекта).
gruy ★★★★★
( 25.12.12 17:27:02 MSK )
Так выпили регистрацию, делов-то.
Ведь фактически требуется только узнать, авторизован ли он в соц. сети
Чиатй api к socialochkaname, руками его впиливать долго и нудно, по идее уже должны быть агрегаторы, типа как addthis был раньше для простых кнопок добавления туда-то и сюда-то.
Deleted
( 26.12.12 05:55:35 MSK )
Ответ на: комментарий от Deleted 26.12.12 05:55:35 MSK

Не катит. Нужно уметь банить.
Пользователь или гость?
Проверить, авторизован ли пользователь на сайте или нет, можно несколькими способами — с помощью фильтров MODX и с помощью методов класса пользователя MODX. Начнём по порядку.
Фильтры MODX
При загрузке страницы MODX выставляет ряд системных плейсхолдеров, в том числе и плейсхолдеры текущего пользователя — modx.user.id и modx.user.username . В них MODX записывает id текущего пользователя и имя пользователя (используемое для логина), при условии конечно, что пользователь авторизован. Если же нет, то modx.user.id будет равен 0, а modx.user.username — «(anonymous)». Кстати, имя гостя можно изменить в системных настройках. К ним мы и будет применять специальные фильтры для проверки авторизации.
Этот способ отлично подойдёт для администраторов и контент-менеджеров, так как не требует от них знаний языка программирования PHP. Достаточно научиться пользоваться фильтрами MODX.
Начнём с самого простого. В шаблонах, ресурсах или чанках вставляем плейсхолдеры текущего пользователя с фильтрами сравнения.
// Если id пользователя больше 0, значит пользователь авторизован, если равен 0, то это гость [[!+modx.user.id:gt=`0`:then=`Пользователь авторизован`:else=`Пользователь не авторизован`]] // Тоже самое, только для другого плейсхолдера. Как правило используется редко [[!+modx.user.username:is=`(anonymous)`:then=`Пользователь авторизован`:else=`Пользователь не авторизован`]] // Плейсхолдеры нужно вызывать некешируемыми.
В результате, если пользователь залогинился, то при обработке тега парсер проверит условие фильтра и подставит вместо плейсхолдера блок с содержанием для пользователя. В этом блоке может быть или просто строка, или вызов чанка или вызов сниппета. А если пользователь не авторизовался, то выведется блок с содержанием для гостя.
- isloggedin — возвращает TRUE, если пользователь авторизован в текущем контексте.
- isnotloggedin — возвращает TRUE, если пользователь не авторизован в текущем контексте.
// Проверяем авторизацию в текущем контексте [[!+modx.user.id:isloggedin:is=`1`:then=`Вы авторизованы`:else=`Вы не авторизованы`]] // Проверяем авторизацию в указанном контексте (web) [[!+modx.user.id:isloggedin=`web`:is=`1`:then=`Вы авторизованы`:else=`Вы не авторизованы`]]
Хочу раскрыть небольшой секрет. Два последних фильтра работают с любыми плейсхолдерами. Им не требуется идентификатор пользователя, так как эти фильтры проверяют авторизацию текущего пользователя используя переменную $modx->user . Поэтому можно проверить авторизацию пользователя даже так
[[!+tralala:isloggedin:is=`1`:then=`Вы авторизованы`:else=`Вы не авторизованы`]] // Или так [[!+100500:isloggedin:is=`1`:then=`Вы авторизованы`:else=`Вы не авторизованы`]]
Но для семантической ясности всё-таки лучше использовать modx.user.id .
Применение фильтров существенно упрощает процесс динамического формирования страницы, но немного нагружает парсер. Кроме того, у них есть один минус — они не работают в ajax режиме.
Программный способ проверки
Для проверки авторизации пользователя в сниппетах и плагинах программистам пригодится метод класса modUser::isAuthenticated() . Он возвращает TRUE, если пользователь авторизован в текущем контексте или в контексте, указанном в качестве аргумента. Как мы видим, он похож на фильтр isloggedin . И это не случайно, так как фильтр как раз и вызывает этот метод для проверки статуса пользователя.
// Проверка авторизации пользователя в текущем контексте if ($modx->user->isAuthenticated()) { // Выполняем код для пользователя }
На этом всё. Надеюсь, этот материал поможет новичкам разобраться как выводить разную информацию для гостей и для пользователей.
05 января 2016 0 17423
Комментарии ( )
Воеводский Михаил 28 марта 2016 # ↓ 0
Добавлю:
Есть еще замечательный метод modX::getAuthenticatedUser($contextKey=»), который возвращает текущего авторизованного пользователя. Если не указан контекст, проверка идет для текущего контекста. Особенность $modx->user в том, что это публичное свойство может быть перезаписано в любой момент, а указанный метод берет сохраненный для контекста в сессии id пользователя, если такой существует, получает объект пользователя из БД и возвращает его. Если любой из шагов провалился (нет авторизации или некорректные данные в сессии), будет возвращен null.
Такая проверка видится мне более корректной. Спасибо Николаю, который описывал работу с пользователями где-то в комментах хабра.
Test 28 марта 2016 # ↑ ↓ 0
Можно и так. Всё зависит от задачи. Но все-таки метод modX::getAuthenticatedUser($contextKey=») предназначен немного для другого.
Пользователь не может переопределить $modx->user. Это может сделать только программист.И если программист программно изменил $modx->user у зарегистрированного пользователя, то он должен быть готов к непредсказуемым результатам. Так как в ядре много проверок $modx->user->isAuthenticated(). А этот метод вернёт false для измененного пользователя. И получается, что пользователь вроде авторизовался, а MODX этого не видит.
П.С. Случайно под тестовой записью ответил