Introdução ao Java Config para Spring Security
1. Visão geral
Este artigo éan introduction to Java configuration for Spring Security, que permite aos usuários configurar facilmente o Spring Security sem o uso de XML.
A configuração Java foi adicionada à estrutura Spring emSpring 3.1e estendida para Spring Security emSpring 3.2e é definida em uma classe anotada@Configuration.
2. Configuração do Maven
Para usar Spring Security em um projeto Maven, primeiro precisamos ter a dependênciaspring-security-core no projetopom.xml:
org.springframework.security
spring-security-core
4.1.3.RELEASE
A versão mais recente sempre pode ser encontradahere.
3. Segurança da Web com configuração Java
Vamos começar com um exemplo básico de configuração Spring Security Java:
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth)
throws Exception {
auth.inMemoryAuthentication().withUser("user")
.password("password").roles("USER");
}
}
Como você deve ter notado, a configuração define uma configuração básica de autenticação na memória.
4. Segurança HTTP
Para habilitar a segurança HTTP no Spring, precisamos estender oWebSecurityConfigurerAdapter para fornecer uma configuração padrão no métodoconfigure(HttpSecurity http):
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
.anyRequest().authenticated()
.and().httpBasic();
}
A configuração padrão acima garante que qualquer solicitação ao aplicativo seja autenticada com login baseado em formulário ou autenticação básica HTTP.
Além disso, é exatamente semelhante à seguinte configuração XML:
5. Login do formulário
Curiosamente, o Spring Security gera uma página de login automaticamente, com base nos recursos ativados e usando valores padrão para a URL que processa o login enviado:
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
.anyRequest().authenticated()
.and().formLogin()
.loginPage("/login").permitAll();
}
Aqui, a página de login gerada automaticamente é conveniente para começar a funcionar rapidamente.
6. Autorização com funções
Vamos agora configurar algumas autorizações simples em cada URL usando funções:
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
.antMatchers("/", "/home").access("hasRole('USER')")
.antMatchers("/admin/**").hasRole("ADMIN")
.and()
// some more method calls
.formLogin();
}
Observe como estamos usando a API de tipo seguro -hasRole - mas também a API baseada em expressão, viaaccess.
7. Sair
Como muitos outros aspectos do Spring Security, o logout possui ótimos padrões fornecidos pela estrutura.
Por padrão, uma solicitação de logout invalida a sessão, limpa todos os caches de autenticação, limpaSecurityContextHoldere redireciona para a página de login.
Aqui está uma configuração de logout simples:
protected void configure(HttpSecurity http) throws Exception {
http.logout();
}
No entanto, se você deseja obter mais controle sobre os manipuladores disponíveis, veja como será uma implementação mais completa:
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. Autenticação
Vamos dar uma olhada em outra maneira de permitir a autenticação com o Spring Security.
8.1. Autenticação na memória
Começaremos com uma configuração simples na memória:
@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. Autenticação JDBC
Para mover isso para o JDBC, tudo o que você precisa fazer é definir uma fonte de dados no aplicativo - e usá-la diretamente:
@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. Conclusão
Neste tutorial rápido, abordamos os conceitos básicos de Java Configuration for Spring Security e focamos nas amostras de código que ilustram os cenários de configuração mais simples.