Visão Geral do Framework Spring Security
O Spring Security é um frameowrk robusto para projetos baseados em Spring, tornando-se a opção padrão para módulos de segurança no Spring Boot. Ele fornece um controle de segurança avançado para aplicações web. A integração é simplificada pela adição do spring-boot-starter-security, permitindo uma implementação poderosa com configuração mínima.
Os componentes centrais incluem:
WebSecurityConfigurerAdapter: Para customização de políticas de segurança.AuthenticationManagerBuilder: Para definir estratégias de autenticação.@EnableWebSecurity: Para habilitar o suporte à segurança web.
Os dois pilares do Spring Security são a "autenticação" (verificação de identidade) e a "autorização" (cnotrole de acesso).
Implementação Prática do Spring Security
1. Adicionando a Dependência
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
2. Definindo a Classe de Configuração
@EnableWebSecurity
public class AppSegurancaConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
.antMatchers("/").permitAll()
.antMatchers("/area1/**").hasRole("user")
.antMatchers("/area2/**").hasRole("manager")
.antMatchers("/area3/**").hasRole("admin");
http.formLogin().loginPage("/acesso");
http.logout().logoutSuccessUrl("/");
http.rememberMe();
}
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
PasswordEncoder encoder = new BCryptPasswordEncoder();
auth.inMemoryAuthentication()
.passwordEncoder(encoder)
.withUser("joao")
.password(encoder.encode("senha123"))
.roles("user", "manager")
.and()
.withUser("admin")
.password(encoder.encode("admin456"))
.roles("user", "manager", "admin")
.and()
.withUser("visitante")
.password(encoder.encode("visita789"))
.roles("user");
}
}
Integração com a Camada de Apresentação (Thymeleaf)
1. Dependências Necessárias
<!-- Motor de template Thymeleaf -->
<dependency>
<groupId>org.thymeleaf</groupId>
<artifactId>thymeleaf-spring5</artifactId>
</dependency>
<dependency>
<groupId>org.thymeleaf.extras</groupId>
<artifactId>thymeleaf-extras-java8time</artifactId>
</dependency>
<!-- Integração Thymeleaf + Spring Security -->
<dependency>
<groupId>org.thymeleaf.extras</groupId>
<artifactId>thymeleaf-extras-springsecurity4</artifactId>
<version>3.0.4.RELEASE</version>
</dependency>
2. Controle de Exibição nas Páginas
Utilizando o namespace de segurança do Thymeleaf, é possível renderizar condicionalmente elementos HTML com base nas permissões do usuário autenticado. Isso permite mostrar ou ocultar menus, links e botões conforme os papéis atribuídos.
Nota sobre CSRF: O Spring Security habilita a proteção contra CSRF por padrão. Caso a funcionalidade de logout não opere como esperado, uma possível causa é a requisição de logout não incluir o token CSRF necessário. É possível desativar essa proteção na configuração do HttpSecurity para fins de desenvolvimento.