Перейти к основному содержимому

Введение в конфигурацию Java для Spring Security

· 3 мин. чтения

1. Обзор

Эта статья представляет собой введение в конфигурацию Java для Spring Security , которая позволяет пользователям легко настраивать Spring Security без использования XML .

Конфигурация Java была добавлена в среду Spring в Spring 3.1 и расширена до Spring Security в Spring 3.2 и определена в классе с аннотацией @Configuration .

2. Настройка Мавена

Чтобы использовать Spring Security в проектах Maven, нам сначала нужно иметь зависимость spring-security-core в проекте pom.xml :

<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-core</artifactId>
<version>5.3.3.RELEASE</version>
</dependency>

Последнюю версию всегда можно найти здесь .

3. Веб-безопасность с конфигурацией Java

Начнем с простого примера конфигурации Java Spring Security:

@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth)
throws Exception {
auth.inMemoryAuthentication().withUser("user")
.password(passwordEncoder().encode("password")).roles("USER");
}
}

Как вы могли заметить, конфигурация устанавливает базовую конфигурацию аутентификации в памяти. Кроме того, начиная с Spring 5, нам нужен bean-компонент PasswordEncoder :

@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}

4. HTTP-безопасность

Чтобы включить безопасность HTTP в Spring, нам нужно расширить WebSecurityConfigurerAdapter , чтобы предоставить конфигурацию по умолчанию в методе configure(HttpSecurity http) :

protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
.anyRequest().authenticated()
.and().httpBasic();
}

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

Кроме того, это точно похоже на следующую конфигурацию XML:

<http>
<intercept-url pattern="/**" access="isAuthenticated()"/>
<form-login />
<http-basic />
</http>

5. Форма входа

Интересно, что Spring Security автоматически создает страницу входа в систему на основе включенных функций и стандартных значений URL-адреса, который обрабатывает отправленный логин:

protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
.anyRequest().authenticated()
.and().formLogin()
.loginPage("/login").permitAll();
}

Здесь автоматически сгенерированная страница входа удобна для быстрого запуска.

6. Авторизация с ролями

Давайте теперь настроим простую авторизацию для каждого URL с помощью ролей:

protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
.antMatchers("/", "/home").access("hasRole('USER')")
.antMatchers("/admin/**").hasRole("ADMIN")
.and()
// some more method calls
.formLogin();
}

Обратите внимание, как мы используем как типобезопасный API — hasRole — так и API на основе выражений через доступ.

7. Выход

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

По умолчанию запрос на выход делает сеанс недействительным, очищает все кэши аутентификации, очищает SecurityContextHolder и перенаправляет на страницу входа.

Вот простая конфигурация выхода из системы:

protected void configure(HttpSecurity http) throws Exception {
http.logout();
}

Однако, если вы хотите получить больше контроля над доступными обработчиками, вот как будет выглядеть более полная реализация:

protected void configure(HttpSecurity http) throws Exception {
http.logout().logoutUrl("/my/logout")
.logoutSuccessUrl("/my/index")
.logoutSuccessHandler(logoutSuccessHandler)
.invalidateHttpSession(true)
.addLogoutHandler(logoutHandler)
.deleteCookies(cookieNamesToClear)
.and()
// some other method calls
}

8. Аутентификация

Давайте посмотрим на другой способ разрешить аутентификацию с помощью Spring Security.

8.1. Аутентификация в памяти

Мы начнем с простой конфигурации в памяти:

@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth)
throws Exception {
auth.inMemoryAuthentication()
.withUser("user").password(passwordEncoder().encode("password")).roles("USER")
.and()
.withUser("admin").password(passwordEncoder().encode("password")).roles("USER", "ADMIN");
}

8.2. JDBC-аутентификация

Чтобы перенести это в JDBC, все, что вам нужно сделать, это определить источник данных в приложении и использовать его напрямую:

@Autowired
private DataSource dataSource;

@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth)
throws Exception {
auth.jdbcAuthentication().dataSource(dataSource)
.withDefaultSchema()
.withUser("user").password(passwordEncoder().encode("password")).roles("USER")
.and()
.withUser("admin").password(passwordEncoder().encode("password")).roles("USER", "ADMIN");
}

Конечно, в обоих приведенных выше примерах нам также необходимо определить bean- компонент PasswordEncoder , как описано в разделе 3.

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

В этом кратком руководстве мы рассмотрели основы настройки Java для Spring Security и сосредоточились на примерах кода, иллюстрирующих простейшие сценарии настройки.