2012-02-22 3 views
2

Вот проблема:Вспомогательная функция для весенней безопасности

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

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

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

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

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

Наличие и формы входа и вторичного выбора на той же странице не является вариантом.

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

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

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

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

ответ

0

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

Это должно работать независимо от типа аутентификации (форма, базовый или запоминающийся), только если вы используете Spring Security 3.1 или новее, так как была введена возможность зарегистрировать аутентификациюSuccessHandler in that version. В Весенних форумах есть discussion on this topic.

+0

Спасибо за предложение, но оно выглядит более сложным, чем наш дизайн БД должен быть.Я реализовал это, введя имя пользователя и дополнительный параметр в самой учетной записи, так что RememberMe уже содержит все значения в одном токене - это была цель. Задача заключалась в том, чтобы определить «вторую» форму входа, чтобы фактически запустить встроенный логин. Эта вторая форма входа фактически имеет только скрытые параметры и управляется JavaScript (т. Е. Пользователь не понимает, что hi заносится в систему снова - он просто выбирает это дополнительное значение). – Nikolay

+0

Я не понимаю, почему вам нужно будет считать субсессию второго экрана фактическим логином. «Вход в систему» ​​устанавливает доверенный сеанс с аутентифицированным пользователем. Все остальное на самом деле является свойством сеанса пользователя, а не контекстом аутентификации. Не можете ли вы считать этот второй выбор простым значением конфигурации пользователя, которое сохраняется? Также я не могу следовать вашему предположению, что это усложнит ваш дизайн БД: это простая таблица с тремя столбцами: имя пользователя, ключ и значение. –

 Смежные вопросы

  • Нет связанных вопросов^_^