Введение в Java Config для Spring Security
1. обзор
Это статьяan introduction to Java configuration for Spring Security, которая позволяет пользователям легко настраивать Spring Security без использования XML..
Конфигурация Java была добавлена в среду Spring вSpring 3.1 и расширена до Spring Security вSpring 3.2 и определена в аннотированном классе@Configuration.
2. Maven Setup
Чтобы использовать Spring Security в проектах Maven, нам сначала нужно иметь зависимостьspring-security-core в проектеpom.xml:
org.springframework.security
spring-security-core
4.1.3.RELEASE
Последнюю версию всегда можно найтиhere.
3. Веб-безопасность с конфигурацией Java
Начнем с базового примера конфигурации Java Spring Security:
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth)
throws Exception {
auth.inMemoryAuthentication().withUser("user")
.password("password").roles("USER");
}
}
Как вы могли заметить, конфигурация устанавливает базовую конфигурацию аутентификации в памяти.
4. HTTP Security
Чтобы включить безопасность HTTP в Spring, нам нужно расширитьWebSecurityConfigurerAdapter, чтобы обеспечить конфигурацию по умолчанию в методеconfigure(HttpSecurity http):
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
.anyRequest().authenticated()
.and().httpBasic();
}
Приведенная выше конфигурация по умолчанию обеспечивает проверку подлинности любого запроса к приложению с помощью входа в систему на основе формы или базовой проверки подлинности HTTP.
Кроме того, это в точности похоже на следующую конфигурацию XML:
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 на основе выражений черезaccess.
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("password").roles("USER")
.and()
.withUser("admin").password("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("password").roles("USER")
.and()
.withUser("admin").password("password").roles("USER", "ADMIN");
}
9. Заключение
В этом кратком руководстве мы рассмотрели основы конфигурации Java для Spring Security и сосредоточились на примерах кода, иллюстрирующих простейшие сценарии конфигурации.