Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java EE (J2EE) и Spring > spring security - ручная аворизация


Автор: iluvatar 7.8.2010, 21:00
Есть приложение, механизмы авторизации - на spring security, а для регистрации используется свой модуль.
После регистрации бросаем письмо пользователю на мыло, он должен пройти по ссылке для активации и после этого хочется его залогинить.

Варианта два я вижу два:
1. редирекнуть его на /j_spring_security_check предварительно записав в запрос логин/пароль
2. вручную положить принципиал в сессию. Для этого надо бросить в контекст объект класса UsernamePasswordAuthenticationToken. А для этого потребуется пароль для поля credentials

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

Как быть?

Автор: ki6opr 9.8.2010, 03:06
ну писать в запрос логин и пароль явно не самая удачная идея.

мне так кажется что если пароль не положить ничего страшного не будет (только если вы потом в приложении не попросите пользователя ввести его еще раз, для какого-нибудь подтверждения). Во всяком случае спринг секьюрити проверяет пароль только в AuthenticationProvider'е

Автор: Joss 9.8.2010, 10:18
Я так понимаю, активация происходит приблизительно т.о.: после регистрации для нового пользователя генерится некий activation code, который встраивается в ссылку, отправляемую пользователю на мыло. Пользователь переходит по ссылке и аккаунт благополучно активируется. Дальше нужно автоматически залогинить пользователя. Я правильно понимаю проблему?
Что если сделать еще один механизм аутентификации по activation code, который, в принципе, будет отрабатывать только раз для пользователя, активируя аккаунт? Ведь связка activation code - user существует.

Автор: Kircul 9.8.2010, 12:03
Цитата(iluvatar @  7.8.2010,  20:00 Найти цитируемый пост)
вручную положить принципиал в сессию. Для этого надо бросить в контекст объект класса UsernamePasswordAuthenticationToken. А для этого потребуется пароль для поля credentials

Насколько я помню, при логине сначала вычисляется хэш (md5 для примера password{salt} -> ce421738b1c5540836bdc8ff707f1572), далее сравнивается с хэшем из базы (я так понимаю именно этот метод используется), и далее токен кладется в сессию. Т.о. пароль в открытом виде вовсе и не нужен.

Автор: iluvatar 9.8.2010, 15:09
Joss, да, механизм именно такой.
Если подскажете как реализовать такую авторизацию средствами спринга - вопрос будет решен, а я буду благодарен во-веки-веков.


Kircul, Я ручками смотрел что находится в сессии, там есть поле, содержащее пароль в незахешированном виде. Не могу сказать для чего это поле вообще используется, но оно там есть.

Автор: iluvatar 13.8.2010, 13:12
может, кому-то пригодится
http://ru.wikibooks.org/wiki/%D0%A2%D0%B5%D1%85%D0%BD%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B9_%D0%BE%D0%B1%D0%B7%D0%BE%D1%80_Spring_Security#.D0.A3.D1.81.D1.82.D0.B0.D0.BD.D0.BE.D0.B2.D0.BA.D0.B0_.D1.81.D0.BE.D0.B4.D0.B5.D1.80.D0.B6.D0.B8.D0.BC.D0.BE.D0.B3.D0.BE_SecurityContextHolder_.D0.BD.D0.B0.D0.BF.D1.80.D1.8F.D0.BC.D1.83.D1.8E

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)