Вход в форму Spring Security

Spring Boot

1. Введение

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

2. Зависимости Maven

Чтобы добавить зависимости Maven в свой проект, см.Spring Security with Mavenодна статья. стандартныйspring-security-webиspring-security-configнеобходимы.

3. Конфигурация Java безопасности Spring

Сначала мы создаем расширениеWebSecurityConfigurerAdapterизSpring SecurityКласс конфигурации. добавлением@EnableWebSecurity, получаем поддержку интеграции Spring Security и MVC:

@Configuration
@EnableWebSecurity
public class SecSecurityConfig extends WebSecurityConfigurerAdapter {
 
    @Override
    protected void configure(final AuthenticationManagerBuilder auth) throws Exception {
        auth.inMemoryAuthentication()
          .withUser("user1").password(passwordEncoder().encode("user1Pass")).roles("USER")
          .and()
          .withUser("user2").password(passwordEncoder().encode("user2Pass")).roles("USER")
          .and()
          .withUser("admin").password(passwordEncoder().encode("adminPass")).roles("ADMIN");
    }
 
    @Override
    protected void configure(final HttpSecurity http) throws Exception {
        http
          .csrf().disable()
          .authorizeRequests()
          .antMatchers("/admin/**").hasRole("ADMIN")
          .antMatchers("/anonymous*").anonymous()
          .antMatchers("/login*").permitAll()
          .anyRequest().authenticated()
          .and()
          .formLogin()
          .loginPage("/login.html")
          .loginProcessingUrl("/perform_login")
          .defaultSuccessUrl("/homepage.html", true)
          //.failureUrl("/login.html?error=true")
          .failureHandler(authenticationFailureHandler())
          .and()
          .logout()
          .logoutUrl("/perform_logout")
          .deleteCookies("JSESSIONID")
          .logoutSuccessHandler(logoutSuccessHandler());
    }
     
    @Bean
    public PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }
}

В этом примере мы используем аутентификацию памяти и определяем 3 пользователей.

Теперь давайте посмотрим на элементы, которые мы использовали для создания конфигурации входа в форму.

3.1. authorizeRequests()

Мы разрешаем анонимный доступ к */login*, чтобы пользователи могли аутентифицироваться, а также для защиты других запросов. Обратите внимание, что порядок элементов *antMatchers()* имеет значение —Сначала вам нужно заполнить конкретные правила пути, а затем правила, которые примерно соответствуют.

3.2. formLogin()

Есть несколько способов настроить поведение входа в форму:

  • loginPage()- Пользовательская страница входа
  • loginProcessingUrl()- Отправить URL для имени пользователя и пароля
  • defaultSuccessUrl()- URL-адрес перенаправляется после успешного входа в систему
  • failureUrl()- URL-адрес перенаправляется после неудачного входа в систему

3.3. Authentication Manager

Поставщик аутентификации поддерживается простой реализацией в памяти —InMemoryUserDetailsManager. Это полезно для быстрого прототипирования, когда полный механизм сохраняемости еще не нужен.

Начиная с Spring 5, мы также должны определить кодировщик паролей.. В нашем примере мы использовалиBCryptPasswordEncoder.

4. Добавьте Spring Security в веб-приложение

Чтобы использовать конфигурацию Spring Security, определенную выше, нам нужно добавить ее в веб-приложение. В данном случае нам ничего не нужноweb.xml:

public class SpringApplicationInitializer 
  extends AbstractAnnotationConfigDispatcherServletInitializer {
   
    protected Class<?>[] getRootConfigClasses() {
        return new Class[] {SecSecurityConfig.class};
    }
}

Обратите внимание, что этот инициализатор не требуется, если мы используем приложение Spring Boot. Дополнительные сведения о том, как загрузить конфигурацию безопасности в Spring Boot, см.Spring Boot security auto-configuration

5. XML-конфигурация безопасности Spring

Давайте взглянем на соответствующую конфигурацию XML. Весь проект использует конфигурацию Java, поэтому нам нужно передать Java@ConfigurationXML-файл конфигурации импорта класса:

@Configuration
@ImportResource({ "classpath:webSecurityConfig.xml" })
public class SecSecurityConfig {
   public SecSecurityConfig() {
      super();
   }
}

и XML-конфигурация Spring Security -webSecurityConfig.xml:

<http use-expressions="true">
    <intercept-url pattern="/login*" access="isAnonymous()" />
    <intercept-url pattern="/**" access="isAuthenticated()"/>
 
    <form-login login-page='/login.html'
      default-target-url="/homepage.html"
      authentication-failure-url="/login.html?error=true" />
    <logout logout-success-url="/login.html" />
</http>
 
<authentication-manager>
    <authentication-provider>
        <user-service>
            <user name="user1" password="user1Pass" authorities="ROLE_USER" />
        </user-service>
        <password-encoder ref="encoder" />
    </authentication-provider>
</authentication-manager>
 
<beans:bean id="encoder"
  class="org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder">
</beans:bean>

6. web.xml

До введения Spring 4 мы использовалиweb.xmlНастройка Spring Security — добавляется только один дополнительный фильтрSpring MVCвеб.xml:

<display-name>Spring Secured Application</display-name>
 
<!-- Spring MVC -->
<!-- ... -->
 
<!-- Spring Security -->
<filter>
    <filter-name>springSecurityFilterChain</filter-name>
    <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>
<filter-mapping>
    <filter-name>springSecurityFilterChain</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

Фильтр — DelegatingFilterProxy — просто делегирует управляемый bean-компонент Spring — FilterChainProxy — который сам может извлечь выгоду из полного управления жизненным циклом bean-компонента Spring.

7. Login Form

Страница формы входа использует простой механизмСопоставление имен представлений с URL-адресамиЗарегистрируйтесь в Spring MVC без написания контроллера:

registry.addViewController("/login.html");

соответствуетlogin.jsp:

<html>
<head></head>
<body>
   <h1>Login</h1>
   <form name='f' action="login" method='POST'>
      <table>
         <tr>
            <td>User:</td>
            <td><input type='text' name='username' value=''></td>
         </tr>
         <tr>
            <td>Password:</td>
            <td><input type='password' name='password' /></td>
         </tr>
         <tr>
            <td><input name="submit" type="submit" value="submit" /></td>
         </tr>
      </table>
  </form>
</body>
</html>
  • Spring Login formСодержит следующие связанные компоненты:
    • login- Принять URL-адрес формы POST, запуская процесс аутентификации.
    • username- имя пользователя
    • password- пароль

8. Дальнейшая настройка входа в Spring

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

Одной из причин переопределения большинства значений по умолчанию в Spring Security являетсяСкрытое приложение защищено Spring Securityфакты и свести к минимуму знание приложения потенциальными злоумышленниками.

После полной настройки элемент входа выглядит следующим образом:

@Override
protected void configure(HttpSecurity http) throws Exception {
    http.formLogin()
      .loginPage("/login.html")
      .loginProcessingUrl("/perform_login")
      .defaultSuccessUrl("/homepage.html",true)
      .failureUrl("/login.html?error=true")
}

Или соответствующая конфигурация XML:

<form-login
  login-page='/login.html'
  login-processing-url="/perform_login"
  default-target-url="/homepage.html"
  authentication-failure-url="/login.html?error=true"
  always-use-default-target="true"/>

8.1. Страница входа

Далее давайте посмотрим, как настроить пользовательскую страницу входа с помощью метода *loginPage()*:

http.formLogin()
  .loginPage("/login.html")

Или используйте конфигурацию XML:

login-page='/login.html'

Если мы не укажем это, Spring Security будет генерировать очень базовую форму входа в систему на * / login *.

8.2 URL-адрес POST для входа в систему

URL-адрес по умолчанию для запуска аутентификации */login*, мы можем использоватьloginProcessingUrlспособ переопределить этот URL:

http.formLogin()
  .loginProcessingUrl("/perform_login")

В качестве альтернативы используйте конфигурацию XML:

login-processing-url="/perform_login"

Хорошая причина переопределить этот URL-адрес по умолчанию: чтобы скрыть приложениеSpring SecurityЗащищенные факты. Эта информация не должна предоставляться извне.

8.3 Страница успешного входа

После успешного входа в систему пользователь будет перенаправлен на страницу — по умолчанию эта страница является корневым каталогом веб-приложения.

Мы можем переопределить его с помощью метода *defaultSuccessUrl()*:

http.formLogin()
  .defaultSuccessUrl("/homepage.html")

Или, используя конфигурацию XML:

default-target-url="/homepage.html"

еслиalways-use-default-targetУстановить какtrue, пользователь всегда перенаправляется на эту страницу. Если это свойство установлено вfalse, пользователь будет перенаправлен на предыдущую страницу, которую он хочет посетить, прежде чем ему будет предложено пройти аутентификацию.

8.4. Страница неудачного входа в систему

То же, что и страница входа, по умолчаниюSpring SecurityСтраница ошибки входа будет автоматически создана в */login?error*.

Чтобы переопределить его, мы можем использовать метод *failureUrl()*:

http.formLogin()
  .failureUrl("/login.html?error=true")

или XML:

authentication-failure-url="/login.html?error=true"

9. Заключение

В этом примере Spring Login мы настроили простой процесс аутентификации — мы обсудили форму входа Spring Security, конфигурацию безопасности и некоторые из более сложных доступных настроек.

Реализацию этого учебника Spring Login можно найти по адресуGitHubНайдено в проекте — это проект на основе Eclipse, поэтому его легко импортировать и запускать.

Когда проект запускается локально, доступ к образцу HTML можно получить по адресу:

http://localhost:8080/spring-security-mvc-login/login.html

оригинал:

Добавить Автора

Переводчик: Лизен