Login do Formulário de Segurança da Primavera
1. Introdução
Este artigo se concentrará emLogin with Spring Security. Vamos construir com base noprevious Spring MVC example simples, pois essa é uma parte necessária da configuração do aplicativo da web junto com o mecanismo de login.
Leitura adicional:
Spring Security - Redirecionar para o URL anterior após o login
Um pequeno exemplo de redirecionamento após o login no Spring Security
Duas páginas de login com Spring Security
Um guia rápido e prático para configurar o Spring Security com duas páginas de login separadas.
Login do Formulário de Segurança da Primavera
Um exemplo de login do Spring - Como configurar um formulário de login simples, uma configuração XML de segurança básica e algumas técnicas de configuração mais avançadas.
2. As dependências do Maven
Para adicionar dependências Maven ao projeto, consulte oSpring Security with Maven article. Os padrõesspring-security-web espring-security-config serão necessários.
3. Configuração de Spring Security Java
Vamos começar criando uma classe de configuração Spring Security que estendeWebSecurityConfigurerAdapter. Adicionando@EnableWebSecurity, temos Spring Security e suporte de integração 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();
}
}
Neste exemplo, usamos a autenticação na memória e definimos 3 usuários.
Vamos agora examinar os elementos que usamos para criar a configuração de login do formulário.
3.1. authorizeRequests()
Estamos permitindo acesso anônimo em/login para que os usuários possam se autenticar. Também estamos protegendo todo o resto.
Observe que a ordem dos elementosantMatchers() é significativa -the more specific rules need to come first, followed by the more general ones.
3.2. formLogin()
Isso tem vários métodos que podemos usar para configurar o comportamento do formulário de login:
-
loginPage() – ocustom login page
-
loginProcessingUrl() - o url para enviar o nome de usuário e senha para
-
defaultSuccessUrl() - a página de destino após um login bem-sucedido
-
failureUrl() - a página de destino após um login malsucedido
3.3. Gerenciador de autenticação
O provedor de autenticação é apoiado por uma implementação simples na memória -InMemoryUserDetailsManager especificamente. Isso é útil para prototipagem rápida quando um mecanismo completo de persistência ainda não é necessário.
Starting with Spring 5, we also have to define a password encoder. Em nosso exemplo, usamos oBCryptPasswordEncoder.
4. Adicionar Spring Security ao aplicativo Web
Para usar a configuração do Spring Security acima definida, precisamos anexá-la ao aplicativo da web. Neste caso, não precisamos de nenhumweb.xml:
public class AppInitializer
extends AbstractAnnotationConfigDispatcherServletInitializer {
protected Class>[] getRootConfigClasses() {
return new Class[] {SecSecurityConfig.class};
}
}
Observe que este inicializador não é necessário se estivermos usando um aplicativo Spring Boot. Dê uma olhada em nosso artigo emSpring Boot security auto-configuration para mais detalhes sobre como a configuração de segurança é carregada no Spring Boot.
5. A configuração XML do Spring Security
Vamos também dar uma olhada na configuração XML correspondente.
O projeto geral está usando a configuração Java, portanto, precisamos importar o arquivo de configuração XML por meio de uma classe Java@Configuration:
@Configuration
@ImportResource({ "classpath:webSecurityConfig.xml" })
public class SecSecurityConfig {
public SecSecurityConfig() {
super();
}
}
E a configuração XML do Spring Security -webSecurityConfig.xml:
6. Oweb.xml
Antes da introdução do Spring 4, costumávamos definir a configuração do Spring Security noweb.xml - apenas um filtro adicional adicionado ao Spring MVCweb.xml padrão:
Spring Secured Application
springSecurityFilterChain
org.springframework.web.filter.DelegatingFilterProxy
springSecurityFilterChain
/*
O filtro -DelegatingFilterProxy - simplesmente delega para um bean gerenciado pelo Spring - oFilterChainProxy - que é capaz de se beneficiar do gerenciamento completo do ciclo de vida do Spring bean e tal.
7. O Formulário de Login
A página do formulário de login será registrada com Spring MVC usando o mecanismo direto paramap views names to URLs sem a necessidade de um controlador explícito entre:
registry.addViewController("/login.html");
Isso, é claro, corresponde alogin.jsp:
Login
OSpring Login form tem os seguintes artefatos relevantes:
-
login - a URL onde o formulário é POSTADO para acionar o processo de autenticação
-
username - o nome de usuário
-
password - a senha
8. Configurando o Login Spring
Discutimos brevemente algumas configurações do mecanismo de login quando introduzimos a configuração Spring Security acima - vamos entrar em alguns detalhes agora.
Um motivo para substituir a maioria dos padrões no Spring Security éhide the fact that the application is secured with Spring Securitye minimizar as informações que um invasor potencial conhece sobre o aplicativo.
Totalmente configurado, o elemento de login fica assim:
@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")
}
Ou a configuração XML correspondente:
8.1. A página de login
A seguir, vamos ver como podemos configurar uma página de login personalizada usando ologinPage() method:
http.formLogin()
.loginPage("/login.html")
Ou, via configuração XML:
login-page='/login.html'
Se não especificarmos isso, Spring Security irá gerar um formulário de login muito básico no URL/login.
8.2. O URL POST para login
A URL padrão onde o Login Spring irá POSTAR para acionar o processo de autenticação é/login, que costumava ser/j_spring_security_check antes deSpring Security 4.
Podemos usar o métodologinProcessingUrl para substituir este URL:
http.formLogin()
.loginProcessingUrl("/perform_login")
Ou, via configuração XML:
login-processing-url="/perform_login"
Um bom motivo para substituir esse URL padrão é ocultar o fato de que o aplicativo é realmente protegido pelo Spring Security - essas informações não devem estar disponíveis externamente.
8.3. A página de destino do sucesso
Após um processo bem-sucedido de login, o usuário é redirecionado para uma página - que por padrão é a raiz do aplicativo Web.
Podemos substituir isso por meio do métododefaultSuccessUrl():
http.formLogin()
.defaultSuccessUrl("/homepage.html")
Ou com configuração XML:
default-target-url="/homepage.html"
Casoalways-use-default-target seja definido como verdadeiro, o usuário é sempre redirecionado para esta página. Se esse atributo estiver definido como falso, o usuário será redirecionado para a página anterior que deseja visitar antes de ser solicitado a se autenticar.
8.4. A página inicial em caso de falha
Da mesma forma que a página de login, a página de falha de login é gerada automaticamente pelo Spring Security em/login?error por padrão.
Para substituir isso, podemos usar o métodofailureUrl():
http.formLogin()
.failureUrl("/login.html?error=true")
Ou com XML:
authentication-failure-url="/login.html?error=true"
9. Conclusão
NesteSpring Login Example, configuramos um processo de autenticação simples - discutimos o Formulário de Login do Spring Security, a Configuração de Segurança e algumas das personalizações mais avançadas disponíveis.
A implementação deste tutorial Spring Login pode ser encontrada emthe GitHub project - este é um projeto baseado em Eclipse, portanto, deve ser fácil de importar e executar como está.
Quando o projeto é executado localmente, o HTML de amostra pode ser acessado em:
http://localhost:8080/spring-security-mvc-login/login.html