Recuperar informações do usuário no Spring Security
1. Visão geral
Este artigo mostrará comoretrieve the user details in Spring Security.
O usuário autenticado atualmente está disponível por meio de uma série de mecanismos diferentes no Spring - vamos abordar a solução mais comum - acesso programático, primeiro.
Leitura adicional:
Acompanhe os usuários conectados com o Spring Security
Um guia rápido para rastrear usuários conectados em um aplicativo criado usando o Spring Security.
Spring Security - Funções e privilégios
Como mapear funções e privilégios para um aplicativo Spring Security: a instalação, a autenticação e o processo de registro.
Spring Security - Redefinir sua senha
Todo aplicativo deve permitir que os usuários alterem sua própria senha, caso a esqueçam.
2. Obtenha o usuário em um bean
A maneira mais simples de recuperar o principal autenticado no momento é por meio de uma chamada estática paraSecurityContextHolder:
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
String currentPrincipalName = authentication.getName();
Uma melhoria nesse trecho é verificar primeiro se há um usuário autenticado antes de tentar acessá-lo:
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
if (!(authentication instanceof AnonymousAuthenticationToken)) {
String currentUserName = authentication.getName();
return currentUserName;
}
É claro que há desvantagens em ter uma chamada estática como essa - diminuição da testabilidade do código, sendo uma das mais óbvias. Em vez disso, vamos explorar soluções alternativas para esse requisito muito comum.
3. Coloque o usuário em um controlador
Em um bean anotado@Controller, existem opções adicionais. The principal can be defined directly as a method argument e será resolvido corretamente pela estrutura:
@Controller
public class SecurityController {
@RequestMapping(value = "/username", method = RequestMethod.GET)
@ResponseBody
public String currentUserName(Principal principal) {
return principal.getName();
}
}
Alternativamente,we can also use the authentication token:
@Controller
public class SecurityController {
@RequestMapping(value = "/username", method = RequestMethod.GET)
@ResponseBody
public String currentUserName(Authentication authentication) {
return authentication.getName();
}
}
A API da classeAuthentication é muito aberta para que a estrutura permaneça o mais flexível possível. Por causa disso,the Spring Security principal can only be retrieved as an Object and needs to be cast to the correct UserDetails instance:
UserDetails userDetails = (UserDetails) authentication.getPrincipal();
System.out.println("User has authorities: " + userDetails.getAuthorities());
E finalmente, diretamentefrom the HTTP request:
@Controller
public class GetUserWithHTTPServletRequestController {
@RequestMapping(value = "/username", method = RequestMethod.GET)
@ResponseBody
public String currentUserNameSimple(HttpServletRequest request) {
Principal principal = request.getUserPrincipal();
return principal.getName();
}
}
4. Obtenha o usuário por meio de uma interface personalizada
Para aproveitar totalmente a injeção de dependência Spring e poder recuperar a autenticação em todos os lugares, não apenas em@Controller beans, precisamos ocultar o acesso estático atrás de uma fachada simples:
public interface IAuthenticationFacade {
Authentication getAuthentication();
}
@Component
public class AuthenticationFacade implements IAuthenticationFacade {
@Override
public Authentication getAuthentication() {
return SecurityContextHolder.getContext().getAuthentication();
}
}
A fachada expõe o objetoAuthentication enquanto oculta o estado estático e mantém o código desacoplado e totalmente testável:
@Controller
public class GetUserWithCustomInterfaceController {
@Autowired
private IAuthenticationFacade authenticationFacade;
@RequestMapping(value = "/username", method = RequestMethod.GET)
@ResponseBody
public String currentUserNameSimple() {
Authentication authentication = authenticationFacade.getAuthentication();
return authentication.getName();
}
}
5. Obtenha o usuário em JSP
O principalcan also be accessed in JSP pages autenticado atualmente, aproveitando o suporte de taglib de segurança de mola. Primeiro, precisamos definir a tag na página:
<%@ taglib prefix="security" uri="http://www.springframework.org/security/tags" %>
Em seguida, podemosrefer to the principal:
authenticated as
6. Obtenha o usuário no Thymeleaf
Thymeleaf é um mecanismo de modelagem da Web moderno do lado do servidor, com uma boa estruturaintegration with the Spring MVC. Vamos ver como acessar o principal autenticado no momento em uma página com o mecanismo Thymeleaf.
Primeiro, precisamos adicionar as dependênciasthymeleaf-spring5ethymeleaf-extras-springsecurity5 para integrar o Thymeleaf com o Spring Security:
org.thymeleaf.extras
thymeleaf-extras-springsecurity5
org.thymeleaf
thymeleaf-spring5
Agorawe can refer to the principal in the HTML page using the sec:authorize attribute:
Authenticated as
7. Conclusão
Este artigo mostrou como obter as informações do usuário em um aplicativo Spring, começando com o mecanismo de acesso estático comum, seguido por várias maneiras melhores de injetar o principal.
A implementação desses exemplos 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 da página inicial pode ser acessado em:
http://localhost:8080/spring-security-rest-custom/foos/1