Login do Formulário de Segurança da Primavera

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

Read more

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.

Read more

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.

Read more

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

User:
Password:

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