Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Ao trabalhar com aplicações Spring Boot que utilizam Spring Security e Thymeleaf, um dos desafios mais comuns é exibir informações do usuário logado em diferentes páginas, sem precisar repetir código em cada controller. Essa tarefa, que parece simples à primeira vista, torna-se especialmente complex quando se tenta manter uma arquitetura limpa e escalável, sobretudo ao usar configurações customizadas de WebMvcConfigurerAdapter ou subclasses de WebMvcConfigurer.
O problema central é que a integração de autenticação com templates não é automática, e o acesso direto às informações do usuário logado nem sempre funciona de forma consistente. Métodos tradicionais, como usar @ModelAttribute em um @ControllerAdvice, ajudam a injetar o usuário em modelos específicos, porém não funcionam de forma automática em todas as views, especialmente quando controllers são configurados via addViewControllers() ou classes de configuração de roteamento que não são controllers convencionais.
Outro ponto é que o Thymeleaf oferece suporte nativo ao Spring Security através de expressões como sec:authentication, mas seu uso direto pode não cobrir todos os cenários de personalização, especialmente quando há entidades complexas ligadas ao usuário, como uma entidade User com atributos adicionais.
A solução mais prática é utilizar as funcionalidades do Thymeleaf Extras Spring Security, que permite acessar informações do usuário logado de forma simplificada. Para isso, é necessário incluir a dependência adequada no projeto:
compile "org.thymeleaf.extras:thymeleaf-extras-springsecurity5"
Com essa dependência, é possível utilizar expressões específicas no template para acessar o Principal ou o Authentication diretamente, como #authentication, #principal, ou #authorization.
Por exemplo, para exibir o nome completo do usuário logado, o código no template seria algo como: A decisão fica mais saudável quando o time consegue medir o impacto depois. Sem esse critério, a solução pode parecer simples no começo e cara no suporte. O valor aparece melhor quando operação, produto e engenharia olham para o mesmo risco. Por isso, o recorte precisa considerar manutenção, validação e caminho de volta. Esse contexto ajuda a separar ganho real de novidade difícil de sustentar. A decisão fica mais saudável quando o time consegue medir o impacto depois. Sem esse critério, a solução pode parecer simples no começo e cara no suporte.
<span th:text="${#authentication.getPrincipal().firstName} "></span> Sem esse critério, a solução pode parecer simples no começo e cara no suporte.
No entanto, para que essa abordagem funcione de forma consistente, é recomendável criar uma configuração global que injete o usuário logado em todos os modelos de view automaticamente, sem precisar alterar cada controller ou view individualmente. O valor aparece melhor quando operação, produto e engenharia olham para o mesmo risco. Por isso, o recorte precisa considerar manutenção, validação e caminho de volta. Esse contexto ajuda a separar ganho real de novidade difícil de sustentar. A decisão fica mais saudável quando o time consegue medir o impacto depois. Sem esse critério, a solução pode parecer simples no começo e cara no suporte. O valor aparece melhor quando operação, produto e engenharia olham para o mesmo risco.
A estratégia eficiente é criar uma classe que implemente ControllerAdvice e registre um @ModelAttribute global. Essa abordagem garante que a variável com os dados do usuário esteja disponível em qualquer template, independentemente do controller ou configuração de roteamento. Por isso, o recorte precisa considerar manutenção, validação e caminho de volta. O valor aparece melhor quando operação, produto e engenharia olham para o mesmo risco. O valor aparece melhor quando operação, produto e engenharia olham para o mesmo risco. O valor aparece melhor quando operação, produto e engenharia olham para o mesmo risco. O valor aparece melhor quando operação, produto e engenharia olham para o mesmo risco.
@ControllerAdvice
public class CurrentUserAdvice {
@ModelAttribute("currentUser")
public User getCurrentUser(Authentication authentication) {
if (authentication == null || !(authentication.getPrincipal() instanceof UserDetails)) {
return null. }
// Aqui, é necessário fazer o cast adequado e obter a entidade User
UserDetails userDetails = (UserDetails) authentication.getPrincipal(). // Supondo que a implementação UserDetails possui um método para obter o usuário completo
return ((CustomUserDetails) userDetails).getUser(). }
} Esse contexto ajuda a separar ganho real de novidade difícil de sustentar. A decisão fica mais saudável quando o time consegue medir o impacto depois. Por isso, o recorte precisa considerar manutenção, validação e caminho de volta.
Com esse método, em qualquer template Thymeleaf, basta usar ${currentUser.firstName} para exibir o nome do usuário logado, sem precisar alterar controllers ou configurações de roteamento. A decisão fica mais saudável quando o time consegue medir o impacto depois. Esse contexto ajuda a separar ganho real de novidade difícil de sustentar. Esse contexto ajuda a separar ganho real de novidade difícil de sustentar. Esse contexto ajuda a separar ganho real de novidade difícil de sustentar. Esse contexto ajuda a separar ganho real de novidade difícil de sustentar. A decisão fica mais saudável quando o time consegue medir o impacto depois. Esse contexto ajuda a separar ganho real de novidade difícil de sustentar.
É importante garantir que o CustomUserDetails ou equivalente realmente contenha os atributos adicionais que você precisa exibir. Além disso, essa abordagem traz um impacto mínimo de performance, pois o usuário é carregado uma única vez por requisição. Sem esse critério, a solução pode parecer simples no começo e cara no suporte. A decisão fica mais saudável quando o time consegue medir o impacto depois. A decisão fica mais saudável quando o time consegue medir o impacto depois. A decisão fica mais saudável quando o time consegue medir o impacto depois. Sem esse critério, a solução pode parecer simples no começo e cara no suporte. A decisão fica mais saudável quando o time consegue medir o impacto depois.
Outro ponto a observar é a segurança: evitar expor informações sensíveis ou confidenciais inadvertidamente. Sempre valide o que será exibido no front-end. O valor aparece melhor quando operação, produto e engenharia olham para o mesmo risco. Sem esse critério, a solução pode parecer simples no começo e cara no suporte. Sem esse critério, a solução pode parecer simples no começo e cara no suporte. Sem esse critério, a solução pode parecer simples no começo e cara no suporte. O valor aparece melhor quando operação, produto e engenharia olham para o mesmo risco. Sem esse critério, a solução pode parecer simples no começo e cara no suporte. Sem esse critério, a solução pode parecer simples no começo e cara no suporte.
Por fim, a integração do Thymeleaf com Spring Security deve estar bem configurada, e a dependência do thymeleaf-extras-springsecurity5 precisa estar presente para que as expressões de segurança funcionem corretamente. Por isso, o recorte precisa considerar manutenção, validação e caminho de volta. O valor aparece melhor quando operação, produto e engenharia olham para o mesmo risco. O valor aparece melhor quando operação, produto e engenharia olham para o mesmo risco. Por isso, o recorte precisa considerar manutenção, validação e caminho de volta. O valor aparece melhor quando operação, produto e engenharia olham para o mesmo risco. O valor aparece melhor quando operação, produto e engenharia olham para o mesmo risco.
Exibir informações do usuário logado de forma automática melhora a experiência do usuário e reduz o acoplamento entre controllers e views. Utilizar @ControllerAdvice com @ModelAttribute é uma estratégia simples, escalável e fácil de manter, especialmente em aplicações que usam configurações de roteamento personalizadas ou controladores não convencionais. Esse contexto ajuda a separar ganho real de novidade difícil de sustentar. Por isso, o recorte precisa considerar manutenção, validação e caminho de volta. Por isso, o recorte precisa considerar manutenção, validação e caminho de volta. Por isso, o recorte precisa considerar manutenção, validação e caminho de volta.
A combinação dessa abordagem com o suporte nativo do Thymeleaf ao Spring Security oferece uma solução robusta para a exibição de dados do usuário em qualquer template, sem complexidade adicional. Assim, o time consegue manter a arquitetura limpa, com menor esforço de manutenção e maior confiança na consistência dos dados exibidos. A decisão fica mais saudável quando o time consegue medir o impacto depois. Esse contexto ajuda a separar ganho real de novidade difícil de sustentar. Esse contexto ajuda a separar ganho real de novidade difícil de sustentar. A decisão fica mais saudável quando o time consegue medir o impacto depois. Esse contexto ajuda a separar ganho real de novidade difícil de sustentar.
Carregando comentários...