Как обрабатывать вход в форму с помощью Spring Безопасность /Spring MVC
Простой вопрос, мне нужен указатель в правильном направлении:
У меня есть простой Spring MVC/Spring Security webapp. Первоначально я настроил Spring Безопасность, чтобы страница входа в систему по умолчанию показывала и аутентифицировала правильно (я выполнил UserDetailsService
с помощью DaoAuthenticationProvider
).
Следующий шаг: замените страницу входа в систему по умолчанию Spring на мою страницу входа и отправьте учетные данные.
Но что мне делать с предоставленными учетными данными для входа? Предполагаю, что я отправляю форму контроллеру, проверяю учетные данные, но я не понимаю, что после этого правильный шаг. Например:.
- Я вызываю метод AuthenticationManager?
- Нужно ли мне определять bean для этого?
- Есть ли интерфейс/служба, которую мне нужно реализовать, например, AuthenticationEntryPoint или что-то в этом роде?
Я ударил документы 3 раза и не совсем следую им. Я знаю, что это просто грязь, поэтому мне просто нужно услышать, как должен протекать процесс.
Ответы
Ответ 1
Spring Безопасность справочная документация описывает основной поток обработки в 5.4 Аутентификация в веб-приложении. Есть пункт № 6:
Далее сервер решит, действительны ли представленные учетные данные. Если они действительны, произойдет следующий шаг. Если они недействительны, обычно вашему браузеру будет предложено повторить попытку (чтобы вы вернулись к шагу 2 выше).
...
Spring Безопасность имеет различные классы, отвечающие за большинство шагов, описанных выше. Основными участниками (в том порядке, в котором они используются) являются ExceptionTranslationFilter, AuthenticationEntryPoint и механизм проверки подлинности ", который отвечает за вызов AuthenticationManager, который мы видели в предыдущем разделе.
Я должен признать, что документация здесь немного запутанна, поэтому я дам вам еще несколько указателей. "Механизм проверки подлинности ", упомянутый здесь, - это то, что вам нужно, оно отвечает за обработку учетные данные, которые отправляет браузер.
Поскольку сведения о прикреплении учетных данных к HTTP-запросу сильно различаются между различными методами проверки подлинности (данные формы против обычных заголовков или заголовков дайджеста), нет обычного механизма проверки подлинности - вместо этого каждый метод реализует свой собственный механизм, а в случае проверки подлинности в Интернете обычно это специальный фильтр, который вы должны настроить в web.xml
.
В вашем случае вас, скорее всего, интересует UsernamePasswordAuthenticationFilter - это используется для обработки базовой информации о регистрации на основе формы. Контракт между вашей пользовательской формой входа и фильтром - это URL-адрес (где размещена форма) + имена имен пользователей и паролей:
Форма входа в систему просто содержит поля ввода j_username и j_password и сообщения в URL-адрес, который отслеживается фильтром (по умолчанию это/j_spring_security_check).
Ответ 2
Я добавлю поясняющий ответ для тех, кто читает это в будущем:
Когда вы определяете тег в spring безопасности, он будет обрабатывать логин для вас, я расскажу о том, как он работает подробно (желательно, чтобы это было подробно описано в документах):
<security:http auto-config="true">
<security:form-login login-page="/login"
login-processing-url="/postlogin"
default-target-url="/myaccount"
authentication-failure-url="/login?loginError=true" />
<security:logout logout-url="/logout" />
</security:http>
страница входа - это URL-адрес страницы входа. У вас должен быть контроллер (или статическая HTML-страница), который обслуживает эту страницу, это ваша красивая форма входа.
login-processing-url - это URL-адрес, который обрабатывает компонент формы-входа. Как будто компонент form-login реализовал собственный контроллер для этой страницы. Вы должны опубликовать свою форму на этой странице. Вы также должны знать, чтобы назвать ваши параметры имени пользователя/пароля "j_username" и "j_login"
Помимо этого и остальных достаточно очевидных опций выше, вы должны были реализовать UserDetailsService
, то есть создать класс, реализовать интерфейс UserDetailsService
, который получает и возвращает объект UserDetails
(< имя пользователя/пароль) для данного имени пользователя - и при условии, что с остальной конфигурацией безопасности:
<security:authentication-manager>
<security:authentication-provider ref="daoAuthenticationProvider" />
</security:authentication-manager>
<bean id="daoAuthenticationProvider"
class="org.springframework.security.authentication.dao.DaoAuthenticationProvider" >
<property name="userDetailsService" ref="myAuthorizationService" />
</bean>
Ответ 3
Мы говорим об одной и той же проблеме все больше и меньше, это мой подход. Посмотрите, что скажут люди.
Ответ 4
См. публикацию limc в ответ на Ritesh ответ на Конфигурирование Spring Security 3.x, чтобы иметь несколько точек входа Посмотрите на разделы под заголовком:
ОБНОВЛЕНИЕ 01-29-2011 - техника @Ritesh
ОБНОВЛЕНИЕ - РЕШЕНИЕ к методу @Ritesh
Это краткий, продвинутый хороший пример того, как вы можете настроить процесс входа в систему Spring Безопасность
Ответ 5
Если вы используете доступную базу данных JDBC, вы можете использовать следующий поставщик аутентификации и не создавать собственный. Он сокращает код, необходимый для 9 строк XML:
<authentication-provider>
<jdbc-user-service data-source-ref="dataSource" users-by-username-query="select username,password from users where username=?" authorities-by-username-query="select u.username, r.authority from users u, roles r where u.userid = r.userid and u.username =?" />
</authentication-provider>
Затем вы можете настроить свой источник данных следующим образом
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost:3306/DB_NAME" />
<property name="username" value="root" />
<property name="password" value="password" />
</bean>
Взгляните на этот пост: http://codehustler.org/blog/spring-security-tutorial-form-login/
Он охватывает все, что вам нужно знать о настройке Spring Security form-login.
Ответ 6
<security:http auto-config="true">
<security:form-login login-page="/login"
login-processing-url="/postlogin"
default-target-url="/myaccount"
authentication-failure-url="/login?loginError=true" />
<security:logout logout-url="/logout" />
</security:http>
login-page - это URL-адрес формы входа в систему
login-processing-url - это URL-адрес, на который отправляется форма входа. Spring предоставит вам самостоятельный вызов менеджера проверки подлинности, отображаемого вами в файле security.xml.
Процесс
- Вам нужно написать класс, который реализует org.springframework.security.authentication.AuthenticationProvider с использованием метода overriden Аутентификация подлинности (аутентификация аутентификации)
- Второй класс, который расширяет org.springframework.security.core.userdetails.UserDetailsService с переопределенным методом loadUserByUsername (имя пользователя String)
- Форма второго класса, где вы можете позвонить в DAO и проверить пользователя с базой данных, извлекающей имя пользователя и пароль.
- В аутентификации аутентификации (аутентификация аутентификации) вы сравните пароль и верните неудачу успеха, если вы закончили.