Recuperar informações do usuário no Spring Security

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.

Read more

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.

Read more

Spring Security - Redefinir sua senha

Todo aplicativo deve permitir que os usuários alterem sua própria senha, caso a esqueçam.

Read more

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