Minha empresa está avaliando o Spring MVC para determinar se devemos usá-lo em um de nossos próximos projetos. Até agora, adoro o que vi e agora estou analisando o módulo Spring Security para determinar se é algo que podemos / devemos usar.
Nossos requisitos de segurança são bem básicos; um usuário só precisa fornecer um nome de usuário e senha para acessar determinadas partes do site (como obter informações sobre sua conta); e há algumas páginas no site (FAQs, suporte etc.) às quais um usuário anônimo deve ter acesso.
No protótipo que estou criando, tenho armazenado um objeto "LoginCredentials" (que apenas contém nome de usuário e senha) na Sessão para um usuário autenticado; alguns dos controladores verificam se este objeto está em sessão para obter uma referência ao nome de usuário conectado, por exemplo. Estou procurando substituir essa lógica caseira pela Spring Security, o que traria o benefício de remover qualquer tipo de "como rastreamos os usuários conectados?" e "como autenticamos usuários?" do meu controlador / código comercial.
Parece que o Spring Security fornece um objeto de "contexto" (por thread) para poder acessar o nome de usuário / informações principais de qualquer lugar do seu aplicativo ...
Object principal = SecurityContextHolder.getContext().getAuthentication().getPrincipal();
... que parece muito pouco primaveril, pois esse objeto é um singleton (global), de certa forma.
Minha pergunta é a seguinte: se esta é a maneira padrão de acessar informações sobre o usuário autenticado no Spring Security, qual é a maneira aceita de injetar um objeto de autenticação no SecurityContext, para que fique disponível para meus testes de unidade quando os testes de unidade exigirem um usuário autenticado?
Preciso conectar isso no método de inicialização de cada caso de teste?
protected void setUp() throws Exception {
...
SecurityContextHolder.getContext().setAuthentication(
new UsernamePasswordAuthenticationToken(testUser.getLogin(), testUser.getPassword()));
...
}
Isso parece muito detalhado. Existe uma maneira mais fácil?
O SecurityContextHolder
objeto em si parece muito pouco parecido com a Primavera ...