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):
5. O biscoito
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:
-
Entrar com Lembrar ativo
-
Feche o navegador
-
Abra novamente o navegador e retorne à mesma página. Atualizar.
-
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á.