代码之家  ›  专栏  ›  技术社区  ›  Espresso

如何在spring数据存储库方法之前打印一些日志,而无需定制repo

  •  0
  • Espresso  · 技术社区  · 7 年前

    什么时候 http://localhost:8080/persons webservice被称为,我想记录一些东西。我不想让我的CustomRepository<>。清洁剂选项?

    回购类别:

    @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 回复  |  直到 7 年前
        1
  •  1
  •   Indra Basak    7 年前

    您可以创建一个方面来拦截对您的 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();
        }
    }
    
    推荐文章