AuthenticatedUser.java
package com.albertsilva.dev.asjcatalog.security.userdetails;
import java.util.Collection;
import org.springframework.security.core.GrantedAuthority;
/**
* Contêiner imutável com id, nome de usuário e authorities do usuário que
* acabou de fazer login, usado <b>apenas durante a emissão do access token</b>.
*
* <p>
* <b>Ciclo de vida:</b> é criado por {@code CustomPasswordAuthenticationProvider}
* após a autenticação e colocado nos {@code details} do
* {@code OAuth2ClientAuthenticationToken}; o customizador de JWT de
* {@code AuthorizationServerConfig} o lê para escrever os claims
* {@code userId}, {@code username} e {@code authorities}. Como o token do
* cliente é guardado na autorização em memória, o objeto também é reaproveitado
* na renovação por refresh token.
* </p>
*
* <p>
* <b>O que não é:</b> não implementa {@code UserDetails}, não é o principal
* das requisições à API (esse é o {@code Jwt}) e não é consultado por
* {@code @PreAuthorize}. O {@code username} é o valor informado no login (a
* consulta ao banco compara o e-mail exatamente, então coincide com o e-mail
* gravado).
* </p>
*/
public class AuthenticatedUser {
private final Long id;
private final String username;
private final Collection<? extends GrantedAuthority> authorities;
/**
* Cria o contêiner. Nenhum argumento é validado; a coleção de authorities é
* guardada por referência (não é copiada).
*
* @param id identificador do usuário
* @param username nome de usuário informado no login
* @param authorities authorities do usuário (as mesmas de {@code User})
*/
public AuthenticatedUser(Long id, String username, Collection<? extends GrantedAuthority> authorities) {
this.id = id;
this.username = username;
this.authorities = authorities;
}
/**
* @return identificador do usuário (vira o claim {@code userId})
*/
public Long getId() {
return id;
}
/**
* @return nome de usuário informado no login (vira o claim {@code username})
*/
public String getUsername() {
return username;
}
/**
* @return authorities do usuário, na mesma coleção recebida no construtor (viram
* o claim {@code authorities})
*/
public Collection<? extends GrantedAuthority> getAuthorities() {
return authorities;
}
}