Вспомни меня функциональность для Spring Security - PullRequest
2 голосов
/ 22 февраля 2012

Вот вопрос:

Мы должны реализовать двухэтапный процесс входа в систему. Первый шаг - пользователь вводит имя / пароль и проходит аутентификацию. Второй шаг - пользователю может быть представлен дополнительный экран выбора, где он выбирает опцию простым щелчком мыши. Когда это сделано, пользователь, наконец, авторизуется для определенного набора действий. На этом процесс аутентификации / авторизации завершается для текущего сеанса пользователя.

Мы используем Spring Security в его стандартной форме: первый экран входа по умолчанию обрабатывается стеком Spring Security, и как только пользователь входит в него, Spring считает процесс входа в систему завершенным.

Вторичный экран выбора полностью находится за пределами Spring Security, и все, что мы делаем при выборе пользователя, возвращает правильно сконфигурированный объект обратно в контекст безопасности. Это работает для текущей сессии, как и ожидалось.

У нас также есть функция запомнить меня, которая реализована с помощью флажка _spring_security_remember_me на первом экране входа в систему, а также переопределенного компонента UserDetailsService.

Запомнить меня отлично работает до тех пор, пока нет дополнительного экрана выбора. Поскольку дополнительный экран не имеет никакого отношения к Spring Security, механизм запоминания не будет активирован для дополнительного параметра, и все, на что он способен, - это запомнить только первый шаг входа в систему. Это приводит к тому, что у запомненного пользователя появляется возможность выбора, и мы должны избежать этого.

Нельзя использовать форму входа и дополнительный выбор на одной странице.

Мы могли бы использовать дополнительный файл cookie, если требуется вторичный выбор, и на основании этого файла cookie «молча» передать необходимый параметр при аутентификации. Но это будет означать, что мы должны сделать кучу ручных вещей, которые Spring Security «должен» предложить, также это выводит некоторую логику безопасности и токены из-под функциональности управляемой безопасности Spring и Запомнить меня.

Итак, вот вопрос к гуру безопасности: как «заставить» функцию запомнить меня принять вторичную представленную опцию? Если бы фильтр «Запомнить меня» мог «проверить» переданный URL-адрес и определить, что опция «Запомнить меня» выбрана, мы могли бы добавить этот параметр. Но это не похоже на то, что это возможно.

Возможно ли / возможно ли использовать еще одну форму входа на дополнительном экране и "тихо" передавать только необходимые дополнительные параметры? Я знаю, что мы не будем включать имя пользователя / пароль в этом случае, по крайней мере, не в чистом виде. Эта опция звучит так, как будто она может быть сделана, но я все еще верю, что может быть более простой способ заставить «Помни меня» сделать то, что он делает. Или есть?

Спасибо, Николай

1 Ответ

0 голосов
/ 04 марта 2012

Вы можете сохранить последнюю выбранную опцию для каждого пользователя в базе данных. Затем вы реализуете AuthenticationSuccessHandler , который считывает сохраненную опцию из базы данных и устанавливает ее в контексте безопасности. Если опция не найдена, пользователь перенаправляется на экран выбора.

Это должно работать независимо от типа аутентификации (форма, базовая или запоминаемая) только в том случае, если вы используете Spring Security 3.1 или более позднюю версию, поскольку в этой версии была введена в этой версии возможность регистрации AuthenticationSuccessHandler. , На весенних форумах обсуждается эта тема .

...