Как обработать форму входа в систему с помощью Spring Security / Spring MVC - PullRequest
16 голосов
/ 01 ноября 2010

Простой вопрос, мне просто нужен указатель в правильном направлении:

У меня есть простое веб-приложение Spring MVC / Spring Security.Сначала я настроил Spring Security, чтобы страница входа по умолчанию отображалась и аутентифицировалась правильно (для этого я UserDetailsService применил DaoAuthenticationProvider).

Следующий шаг: замените страницу входа в Spring по умолчанию на мойстраницу входа и отправьте учетные данные.

Но что мне делать с предоставленными учетными данными для входа? Я предполагаю, что отправляю форму контроллеру, проверяю учетные данные,но мне не ясно, каков правильный шаг после этого.Например:

  • Вызываю ли я метод AuthenticationManager?
  • Нужно ли для этого определять бин?
  • Есть ли какой-либо интерфейс / служба, которую мне нужно реализовать, например AuthenticationEntryPoint или что-то в этом роде?

Я трижды просматривал документы и не совсем им следую.Я знаю, что это очень просто, поэтому мне просто нужно услышать, как этот процесс протекает.

Ответы [ 6 ]

20 голосов
/ 02 ноября 2010

Я добавлю уточняющий ответ для любого, кто будет читать это в будущем:

Когда вы определите тег в Spring Security, он будет обрабатывать логин для вас, я подробно расскажу, как он работает(если бы это было подробно описано в документации):

<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 (имя пользователя / пароль) для заданного имени пользователя и предоставляет этому объекту 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>
11 голосов
/ 01 ноября 2010

Spring Security справочная документация описывает основной процесс обработки в 5.4 Аутентификация в веб-приложении . Есть пункт № 6:

Далее сервер решит, действительны ли представленные учетные данные. Если они действительны, следующий шаг произойдет. Если они недействительны, обычно вашему браузеру будет предложено повторить попытку (поэтому вы вернетесь к шагу два выше).

...

Spring Security имеет различные классы, отвечающие за большинство шагов, описанных выше. Основными участниками (в порядке их использования) являются ExceptionTranslationFilter, AuthenticationEntryPoint и « механизм аутентификации », который отвечает за вызов AuthenticationManager, который мы видели в предыдущем разделе.

Я должен признать, что документация здесь немного сбивает с толку, поэтому я дам вам еще несколько советов - " механизм аутентификации ", упомянутый здесь, - это то, что вам нужно, он отвечает за обработку учетные данные, которые отправляет браузер.

Поскольку детали присоединения учетных данных к HTTP-запросам сильно различаются в зависимости от различных методов аутентификации (данные формы, обычные заголовки и заголовки дайджеста), не существует общего механизма аутентификации - вместо этого каждый метод реализует свой собственный механизм, а в случае сетевой аутентификации обычно это специальный фильтр , который необходимо настроить в web.xml.

В вашем случае вас, скорее всего, заинтересует UsernamePasswordAuthenticationFilter - он используется для обработки базовой информации для входа в систему на основе форм . Контракт между вашей пользовательской формой входа и фильтром заключается в URL-адресе (где размещена форма) + имена пользователей и поля с паролями:

Форма входа просто содержит поля ввода j_username и j_password и сообщения на URL-адрес, отслеживаемый фильтром (по умолчанию это /j_spring_security_check).
2 голосов
/ 14 июля 2017
<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.

Процесс

  1. Вам необходимо написать класс, который реализует org.springframework.security.authentication.AuthenticationProvider с переопределенным методом Authentication authenticate (Authentication authentication)
  2. Второй класскоторый расширяет org.springframework.security.core.userdetails.UserDetailsService с переопределенным методом loadUserByUsername (String username)
  3. Форма второго класса, где вы можете вызвать DAO и проверить пользователя с помощью базы данных, выбирающей имя пользователя и пароль.
  4. В разделе Аутентификация с аутентификацией (Аутентификация с аутентификацией) вы сравните пароль и вернете сообщение об ошибке, если все готово.
1 голос
/ 02 апреля 2014

Если вы используете базу данных, доступную в 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.

1 голос
/ 12 февраля 2012

См. Сообщение limc в ответ на ответ Ritesh на Настройка Spring Security 3.x для нескольких точек входа Посмотрите на разделы, озаглавленные :

ОБНОВЛЕНИЕ 01-29-2011 - @ Техника Ритеша
ОБНОВЛЕНИЕ - РЕШЕНИЕ к технике @ Ritesh

Это краткий, продвинутый хороший пример того, как вы можете настроить процесс входа в Spring Security

1 голос
/ 01 ноября 2010

Мы говорим об одной и той же проблеме все больше и меньше, это мой подход посмотрим, что скажут люди.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...