Protegendo o Java EE com Spring Security

Protegendo o Java EE com Spring Security

1. Visão geral

Neste tutorial rápido, veremos comosecure a Java EE web application with Spring Security.

2. Dependências do Maven

Vamos começar com osSpring Security dependencies necessários para este tutorial:


    org.springframework.security
    spring-security-web
    4.2.3.RELEASE


    org.springframework.security
    spring-security-config
    4.2.3.RELEASE


    org.springframework.security
    spring-security-taglibs
    4.2.3.RELEASE

A versão mais recente do Spring Security (no momento em que este tutorial foi escrito) é 4.2.3.RELEASE; como sempre, podemos verificarMaven Central para as versões mais recentes.

3. Configuração de segurança

Em seguida, precisamos definir a configuração de segurança para o aplicativo Java EE existente:

@Configuration
@EnableWebSecurity
public class SpringSecurityConfig
  extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(AuthenticationManagerBuilder auth)
      throws Exception {
        auth.inMemoryAuthentication()
          .withUser("user1").password("user1Pass").roles("USER")
          .and()
          .withUser("admin").password("adminPass").roles("ADMIN");
    }
}

No métodoconfigure(), configuramos oAuthenticationManager. Por uma questão de simplicidade, implementamos uma autenticação simples na memória. Os detalhes do usuário são codificados.

Isso deve ser usado para prototipagem rápida quando um mecanismo completo de persistência não é necessário.

A seguir, vamos integrar a segurança ao sistema existente adicionando a classeSecurityWebApplicationInitializer:

public class SecurityWebApplicationInitializer
  extends AbstractSecurityWebApplicationInitializer {

    public SecurityWebApplicationInitializer() {
        super(SpringSecurityConfig.class);
    }
}

Esta classe garantirá queSpringSecurityConfig seja carregado durante a inicialização do aplicativo. Nesse estágio,we’ve achieved a basic implementation of Spring Security. Com essa implementação, o Spring Security exigirá autenticação para todos os pedidos e rotas por padrão.

4. Configurando Regras de Segurança

Podemos personalizar ainda mais o Spring Security substituindo o métodoWebSecurityConfigurerAdapter'sconfigure(HttpSecurity http):

@Override
protected void configure(HttpSecurity http) throws Exception {
    http
      .csrf().disable()
      .authorizeRequests()
      .antMatchers("/auth/login*").anonymous()
      .anyRequest().authenticated()
      .and()
      .formLogin()
      .loginPage("/auth/login")
      .defaultSuccessUrl("/home", true)
      .failureUrl("/auth/login?error=true")
      .and()
      .logout().logoutSuccessUrl("/auth/login");
}

Usando o métodoantMatchers(), configuramos Spring Security para permitir o acesso anônimo a/auth/logine __ autenticar qualquer outra solicitação.

4.1. Página de login personalizada

Uma página de login personalizada é configurada usando o métodoformLogin():

http.formLogin()
  .loginPage("/auth/login")

Se isso não for especificado, o Spring Security gera uma página de login padrão em/login:




Login

User:
Password:

4.2. Página de destino personalizada

Após o login bem-sucedido, o Spring Security redireciona o usuário para a raiz do aplicativo. Podemos substituir isso especificando um URL de sucesso padrão:

http.formLogin()
  .defaultSuccessUrl("/home", true)

Ao definir o parâmetroalwaysUse do métododefaultSuccessUrl() como verdadeiro, um usuário sempre será redirecionado para a página especificada.

Se o parâmetroalwaysUse não estiver definido ou estiver definido como falso, o usuário será redirecionado para a página anterior que tentou acessar antes de ser solicitada a autenticação.

Da mesma forma, também podemos especificar uma página de destino de falha personalizada:

http.formLogin()
  .failureUrl("/auth/login?error=true")

4.3. Autorização

Podemos restringir o acesso a um recurso por função:

http.formLogin()
  .antMatchers("/home/admin*").hasRole("ADMIN")

Um usuário não administrador receberá um erro de acesso negado se tentar acessar o endpoint/home/admin.

Também podemos restringir os dados em uma página JSP com base na função de um usuário. Isso é feito usando a tag<security:authorize>:


    This text is only visible to an admin
    
">Admin Page

Para usar essa tag, precisamos incluir as tags Spring Security taglib na parte superior da página:

<%@ taglib prefix="security"
  uri="http://www.springframework.org/security/tags" %>

5. Configuração XML do Spring Security

Até agora, analisamos a configuração do Spring Security em Java. Vamos dar uma olhada em uma configuração XML equivalente.

Primeiro, precisamos criar um arquivosecurity.xml na pastaweb/WEB-INF/spring que contém nossas configurações XML. Um exemplo desse arquivo de configuraçãosecurity.xml está disponível no final do artigo.

Vamos começar configurando o gerenciador de autenticação e o provedor de autenticação. Por uma questão de simplicidade, usamos credenciais simples de usuário codificadas:


    
        
            
        
    

O que acabamos de fazer é criar um usuário com um nome de usuário, senha e uma função.

Como alternativa, podemos configurar nosso provedor de autenticação com um codificador de senha:


    
        
        
            
        
    

Também podemos especificar uma implementação personalizada deUserDetailsService ouDatasource do Spring como nosso provedor de autenticação. Mais detalhes podem ser encontradoshere.

Agora que configuramos o gerenciador de autenticação, vamos configurar as regras de segurança e aplicar o controle de acesso:


    
    
    
    

No snippet acima, configuramosHttpSecurity para usar o login do formulário e definimos/secure.jsp como a URL de sucesso do login. Concedemos acesso anônimo a/index.jspe o caminho“/”. Além disso, especificamos que o acesso a/secure.jsp deve exigir autenticação e um usuário autenticado deve ter, pelo menos, o nível de autoridadeROLE_USER.

Definir o atributoauto-config da taghttp paratrue instrui o Spring Security a implementar comportamentos padrão que não temos que substituir na configuração. Portanto,/logine/logout serão usados ​​para login e logout do usuário, respectivamente. Uma página de login padrão também é fornecida.

Podemos personalizar ainda mais a tagform-login com páginas personalizadas de login e logout, URLs para lidar com falhas e sucesso de autenticação. OSecurity Namespace appendix lista todos os atributos possíveis para as tagsform-login (e outras). Alguns IDEs também possibilitam a inspeção clicando em uma tag enquanto pressiona a teclactrl.

Finalmente, para que a configuraçãosecurity.xml seja carregada durante a inicialização do aplicativo, precisamos adicionar as seguintes definições ao nossoweb.xml:


    contextConfigLocation
    
      /WEB-INF/spring/*.xml
    



    springSecurityFilterChain
    
      org.springframework.web.filter.DelegatingFilterProxy



    springSecurityFilterChain
    /*



    
        org.springframework.web.context.ContextLoaderListener
    

Observe que tentar usar configurações baseadas em XML e Java no mesmo aplicativo JEE pode causar erros.

6. Conclusão

Neste artigo, vimos como proteger um aplicativo Java EE com o Spring Security e demonstramos configurações baseadas em Java e XML.

Também discutimos maneiras de conceder ou revogar acesso a recursos específicos com base na função de um usuário.

O código-fonte completo e as definições XML estão disponíveisover on GitHub.