Как напечатать некоторые журналы "до" метода хранилища данных Spring, без пользовательского репо

У меня есть хранилище данных Spring. Когда http://localhost:8080/persons Person Webservice вызывается, я хочу что-то войти. Я не хочу делать MyCustomRepository<>. Более чистые варианты?

Репо класс:

@RepositoryRestResource(collectionResourceRel = "persons", path = "persons")
public interface PersonRepository extends PagingAndSortingRepository<Person, Long> {

    List<Person> findByLastName(@Param("name") String name);

Пример журнала:

log.error("AccessToken: " + securityContext.getTokenString());
log.error("User: {} / {}", accessToken.getPreferredUsername(), accessToken.getName());
log.error("Principal: {}", principal.getName());

1 ответ

Решение

Вы можете создать аспект для перехвата вызовов на ваш PersonRepository, Оттуда вы можете получить доступ к токену доступа OAuth2 и контексту безопасности для получения принципала. Вот пример,

@Component
@Aspect
@Log
public class SecurityAspect {

    @Autowired
    private OAuth2ClientContext oauth2ClientContext;

    @Pointcut("execution(public * my.example.repository.PersonRepository.*(..))")
    public void pointcut() {
    }

    @Around("pointcut()")
    public Object advice(ProceedingJoinPoint pjp) throws Throwable {
        log.info(
                "Entering SecurityAspect.advice() in class "
                        + pjp.getSignature().getDeclaringTypeName()
                        + " - method: " + pjp.getSignature().getName());

        OAuth2AccessToken accessToken = oauth2ClientContext.getAccessToken();
        log.info("AccessToken: " + accessToken);

        if (SecurityContextHolder.getContext().getAuthentication()
                instanceof OAuth2Authentication) {
            OAuth2Authentication authentication =
                    (OAuth2Authentication) SecurityContextHolder.getContext().getAuthentication();
            if (authentication.getUserAuthentication() instanceof UsernamePasswordAuthenticationToken) {
                UsernamePasswordAuthenticationToken userToken =
                        (UsernamePasswordAuthenticationToken) authentication.getUserAuthentication();
                log.info("Principal id: " + userToken.getPrincipal());
                if (userToken.getDetails() instanceof Map) {
                    Map details = (Map) userToken.getDetails();
                    log.info("Principal Name: " + details.get("name"));
                }
            }
        }

        return pjp.proceed();
    }
}
Другие вопросы по тегам