I have the same problem and my solution is:
Configuration Aware class in order to get user:
import java.security.Principal;
import java.util.Optional;
import javax.servlet.http.HttpServletRequest;
import org.keycloak.adapters.springsecurity.token.KeycloakAuthenticationToken;
import org.keycloak.representations.AccessToken;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.AuditorAware;
public class AuditorAwareConfig implements AuditorAware<String> {
@Autowired
private HttpServletRequest request;
@Override
public Optional<String> getCurrentAuditor() {
AccessToken accessToken = this.getKeycloakToken(request.getUserPrincipal());
String userName = accessToken.getPreferredUsername();
return Optional.ofNullable(userName);
}
private AccessToken getKeycloakToken(Principal principal) {
KeycloakAuthenticationToken keycloakAuthenticationToken = (KeycloakAuthenticationToken) principal;
return keycloakAuthenticationToken.getAccount().getKeycloakSecurityContext().getToken();
}
Class enabling JPA Auditing:
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.domain.AuditorAware;
import org.springframework.data.jpa.repository.config.EnableJpaAuditing;
@Configuration
@EnableJpaAuditing(auditorAwareRef = "auditorProvider")
public class AuditConfig {
@Bean
AuditorAware<String> auditorProvider() {
return new AuditorAwareConfig();
}
}
Auditable class:
@MappedSuperclass
@EntityListeners(AuditingEntityListener.class)
@JsonIgnoreProperties(
value = {"createdAt", "createdBy","updatedAt", "updatedBy"},
allowGetters = true
)
public abstract class Auditable {
@CreatedDate
@Column(name="AUD_CREATE_AT", nullable = false, updatable = false)
private Instant createdAt;
@CreatedBy
@Column(name="AUD_CREATE_BY", nullable = false, updatable = false)
private String createdBy;
@LastModifiedDate
@Column(name="AUD_UPDATE_AT",nullable = false)
private Instant updatedAt;
@LastModifiedBy
@Column(name="AUD_UPDATE_BY",nullable = false)
private String updatedBy;
//Getters & Setters
At entity class:
@Entity
@Table(name="FOO")
public class FooEntity extends Auditable implements Serializable
...