package org.apereo.cas.audit.spi;
import org.apereo.cas.authentication.AuthenticationCredentialsLocalBinder;
import org.apereo.inspektr.common.spi.PrincipalResolver;
import org.aspectj.lang.JoinPoint;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* Inspektr PrincipalResolver that gets the value for principal id from Authentication object bound to a current thread of execution.
*
* @author Dmitriy Kopylenko
* @since 5.0.0
*/
public class ThreadLocalPrincipalResolver implements PrincipalResolver {
private static final Logger LOGGER = LoggerFactory.getLogger(ThreadLocalPrincipalResolver.class);
private PrincipalIdProvider principalIdProvider;
public ThreadLocalPrincipalResolver(final PrincipalIdProvider principalIdProvider) {
this.principalIdProvider = principalIdProvider;
}
@Override
public String resolveFrom(final JoinPoint auditTarget, final Object returnValue) {
LOGGER.trace("Resolving principal at audit point [{}]", auditTarget);
return getCurrentPrincipal();
}
@Override
public String resolveFrom(final JoinPoint auditTarget, final Exception exception) {
LOGGER.trace("Resolving principal at audit point [{}] with thrown exception [{}]", auditTarget, exception);
return getCurrentPrincipal();
}
@Override
public String resolve() {
return UNKNOWN_USER;
}
private String getCurrentPrincipal() {
String principal = this.principalIdProvider.getPrincipalIdFrom(AuthenticationCredentialsLocalBinder.getCurrentAuthentication());
if (principal == null) {
principal = AuthenticationCredentialsLocalBinder.getCurrentCredentialIdsAsString();
}
return principal != null ? principal : UNKNOWN_USER;
}
}