Я использую SecurityContextHolder
и пользовательский UserDetailsService
для получения UserDetails
из SecurityContextHolder
:
Object o = SecurityContextHolder.getContext().getAuthentication().getPrincipal();
UserDetailsDTO user = (UserDetailsDTO) o;
Я пропустил нулевые проверки и т. Д., Но это идея. Я использую это в @Around
pointcut @Aspect
:
@Around("execution(* user.service.*.*(..))")
public Object audit(ProceedingJoinPoint call) throws Throwable {
// get user id
// add audit row in db
}
Глядя на класс SecurityContextHolder
, он по умолчанию использует ThreadLocal
, но у точки pointcut, похоже, также есть некая инкапсулированная логика потоков.
Возможно ли, что возможна коллизия пользователей (то есть доступ к UserA из одного сеанса для события аудита UserB в другом параллельном сеансе) или, возможно, вообще нулевой пользователь.
Есть ли лучший способ получить учетные данные / профиль пользователя?