Spring Security - Persistent Remember Me

Spring Security - Persistent Remember Me

1. Visão geral

Este artigo mostrará como configurar oRemember Me functionality in Spring Security - usando não a abordagem de cookies padrão apenas, masa more secure solution, using persistence.

Como introdução rápida - o Spring pode ser configurado para lembrar os detalhes de login entre as sessões do navegador. Isso permite que você faça login em um site e faça com que ele faça o logon automaticamente na próxima vez que você visitar o site (mesmo que você tenha fechado o navegador nesse meio tempo).

2. Duas soluções para “lembrar de mim”

O Spring fornece duas implementações ligeiramente diferentes para resolver o problema. Ambos usamUsernamePasswordAuthenticationFilter, usando ganchos para invocar uma implementaçãoRememberMeServices.

Já cobrimos a solução padrão Remember Me, usando apenas um cookie, ema previous article. Esta solução usava um cookie chamadoremember-me - contendo o nome de usuário, tempo de expiração e hash MD5 contendo a senha. Porque contém um hash da senha,this solution is potentially vulnerable se o cookie for capturado.

Com isso em mente - vamos dar uma olhada na segunda abordagem - usandoPersistentTokenBasedRememberMeServices para armazenar as informações de login persistentes em uma tabela de banco de dados entre as sessões.

3. Pré-requisitos - Criar a tabela de banco de dados

Primeiro - precisamos ter as informações de login no banco de dados - precisamos criar uma tabela para armazenar os dados:

create table if not exists persistent_logins (
  username varchar_ignorecase(100) not null,
  series varchar(64) primary key,
  token varchar(64) not null,
  last_used timestamp not null
);

Isso écreated automatically on startup por meio da seguinte configuração XML (usando um banco de dados H2 na memória):



    

E por uma questão de integridade, eis a maneira como a persistência é configurada:

@Configuration
@EnableTransactionManagement
@PropertySource({ "classpath:persistence-h2.properties" })
public class DatabaseConfig {

    @Autowired private Environment env;

    @Bean
    public DataSource dataSource() {
        DriverManagerDataSource dataSource = new DriverManagerDataSource();
        dataSource.setDriverClassName(env.getProperty("jdbc.driverClassName"));
        dataSource.setUrl(env.getProperty("jdbc.url"));
        dataSource.setUsername(env.getProperty("jdbc.user"));
        dataSource.setPassword(env.getProperty("jdbc.pass"));
        return dataSource;
    }
}

[.iframe-fluido] ##

4. A configuração de segurança Spring

A primeira configuração de chave é a Configuração Http de Remember-Me (observe a propriedadedataSource):


    ...
    

Em seguida - precisamos configurar oRememberMeService real e oJdbcTokenRepository (que também faz uso dodataSource):



    
    
    




    
    




    
    

Como mencionamos, oTokenBasedRememberMeServices padrão estava armazenando a senha do usuário com hash no cookie.

Esta solução - oPersistentTokenBasedRememberMeServices usa umunique series identifier for the user. Isso identifica o logon inicial do usuário e permanece constante cada vez que o usuário efetua login automaticamente durante a sessão persistente. Ele também contéma random token que é regenerado sempre que um usuário efetua login por meio das funções de lembrar-me persistentes.

Essa combinação de séries e token gerados aleatoriamente é mantida, tornando muito improvável um ataque de força bruta.

6. Na prática

Para ver o mecanismo de lembrar-me trabalhando em um navegador, você pode:

  1. Entrar com Lembrar ativo

  2. Feche o navegador

  3. Abra novamente o navegador e retorne à mesma página. Atualizar.

  4. Você ainda estará logado

Without Remember Me active, depois que o cookie expira, o usuário deve ser redirecionado de volta para a página de login. With remember me, o usuário agora permanece conectado com a ajuda do novo token / cookie.

Você também pode visualizar os cookies no navegador e os dados persistentes no banco de dados (note - você pode mudar da implementação H2 incorporada para isso).

7. Conclusão

Este tutorial ilustrou comoset up and configure a database persisted Remember Me Token functionality. É também uma continuação do artigo anterior que discutiu ostandard Cookie Token based functionality. A abordagem do banco de dados é mais segura, pois os detalhes da senha não são persistentes no cookie - mas envolve um pouco mais de configuração.

A implementação deste tutorial REST do Spring Security pode ser encontrada emthe github project - este é um projeto baseado em Eclipse, portanto, deve ser fácil de importar e executar como está.