79 lines
5.4 KiB
HTML
79 lines
5.4 KiB
HTML
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html xmlns="http://www.w3.org/1999/xhtml" lang="en"><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8"/><link rel="stylesheet" href="../jacoco-resources/report.css" type="text/css"/><link rel="shortcut icon" href="../jacoco-resources/report.gif" type="image/gif"/><title>KeycloakUserLoader.java</title><link rel="stylesheet" href="../jacoco-resources/prettify.css" type="text/css"/><script type="text/javascript" src="../jacoco-resources/prettify.js"></script></head><body onload="window['PR_TAB_WIDTH']=4;prettyPrint()"><div class="breadcrumb" id="breadcrumb"><span class="info"><a href="../jacoco-sessions.html" class="el_session">Sessions</a></span><a href="../index.html" class="el_report">application</a> > <a href="index.source.html" class="el_package">com.project.auth.application.auth.identity.internal</a> > <span class="el_source">KeycloakUserLoader.java</span></div><h1>KeycloakUserLoader.java</h1><pre class="source lang-java linenums">package com.project.auth.application.auth.identity.internal;
|
|
|
|
import com.project.auth.application.auth.exception.KeycloakAccountConflictException;
|
|
import com.project.auth.application.auth.identity.KeycloakUserClaims;
|
|
import com.project.auth.application.auth.identity.LoadKeycloakUserUseCase;
|
|
import com.project.auth.application.auth.identity.LoadedKeycloakUser;
|
|
import com.project.auth.application.auth.identity.port.out.LoadKeycloakUserPort;
|
|
import com.project.auth.application.auth.identity.port.out.RegisterKeycloakUserPort;
|
|
import com.project.auth.application.support.audit.AuthAuditEvent;
|
|
import com.project.auth.application.support.audit.AuthAuditEventPublisher;
|
|
import com.project.auth.application.support.audit.AuthAuditEventType;
|
|
import com.project.auth.application.support.audit.AuthAuditFields;
|
|
import com.project.auth.domain.user.model.AuthProvider;
|
|
import com.project.auth.domain.user.model.User;
|
|
import org.springframework.transaction.annotation.Transactional;
|
|
|
|
import java.time.Clock;
|
|
import java.time.Instant;
|
|
import java.util.Objects;
|
|
import java.util.UUID;
|
|
|
|
public class KeycloakUserLoader implements LoadKeycloakUserUseCase {
|
|
|
|
private final LoadKeycloakUserPort loadKeycloakUserPort;
|
|
private final RegisterKeycloakUserPort registerKeycloakUserPort;
|
|
private final AuthAuditEventPublisher authAuditEventPublisher;
|
|
private final Clock clock;
|
|
|
|
public KeycloakUserLoader(
|
|
LoadKeycloakUserPort loadKeycloakUserPort,
|
|
RegisterKeycloakUserPort registerKeycloakUserPort,
|
|
AuthAuditEventPublisher authAuditEventPublisher,
|
|
Clock clock
|
|
<span class="fc" id="L34"> ) {</span>
|
|
<span class="fc" id="L35"> this.loadKeycloakUserPort = Objects.requireNonNull(loadKeycloakUserPort, "loadKeycloakUserPort must not be null");</span>
|
|
<span class="fc" id="L36"> this.registerKeycloakUserPort = Objects.requireNonNull(</span>
|
|
registerKeycloakUserPort,
|
|
"registerKeycloakUserPort must not be null"
|
|
);
|
|
<span class="fc" id="L40"> this.authAuditEventPublisher = Objects.requireNonNull(</span>
|
|
authAuditEventPublisher,
|
|
"authAuditEventPublisher must not be null"
|
|
);
|
|
<span class="fc" id="L44"> this.clock = Objects.requireNonNull(clock, "clock must not be null");</span>
|
|
<span class="fc" id="L45"> }</span>
|
|
|
|
@Override
|
|
@Transactional
|
|
public LoadedKeycloakUser load(KeycloakUserClaims claims) {
|
|
<span class="fc" id="L50"> ValidatedKeycloakUserClaims validatedClaims = KeycloakUserClaimsValidator.validate(claims);</span>
|
|
|
|
<span class="fc" id="L52"> User user = loadKeycloakUserPort.findByProviderAndProviderSubject(AuthProvider.KEYCLOAK, validatedClaims.subject())</span>
|
|
<span class="fc" id="L53"> .orElseGet(() -> autoRegister(validatedClaims));</span>
|
|
|
|
<span class="fc" id="L55"> return LoadedKeycloakUser.from(user);</span>
|
|
}
|
|
|
|
private User autoRegister(ValidatedKeycloakUserClaims claims) {
|
|
<span class="fc bfc" id="L59" title="All 2 branches covered."> if (loadKeycloakUserPort.existsByEmail(claims.email())) {</span>
|
|
<span class="fc" id="L60"> throw new KeycloakAccountConflictException();</span>
|
|
}
|
|
|
|
<span class="fc" id="L63"> User newUser = User.registerKeycloak(</span>
|
|
<span class="fc" id="L64"> UUID.randomUUID(),</span>
|
|
<span class="fc" id="L65"> claims.email(),</span>
|
|
<span class="fc" id="L66"> claims.name(),</span>
|
|
<span class="fc" id="L67"> claims.subject(),</span>
|
|
<span class="fc" id="L68"> Instant.now(clock)</span>
|
|
);
|
|
<span class="fc" id="L70"> User saved = registerKeycloakUserPort.register(newUser);</span>
|
|
<span class="fc" id="L71"> authAuditEventPublisher.publish(AuthAuditEvent.info(</span>
|
|
<span class="fc" id="L72"> AuthAuditEventType.KEYCLOAK_USER_AUTO_REGISTERED.code(),</span>
|
|
AuthAuditFields.PROVIDER, AuthProvider.KEYCLOAK,
|
|
<span class="fc" id="L74"> AuthAuditFields.SUBJECT, claims.subject()</span>
|
|
));
|
|
<span class="fc" id="L76"> return saved;</span>
|
|
}
|
|
}
|
|
</pre><div class="footer"><span class="right">Created with <a href="http://www.jacoco.org/jacoco">JaCoCo</a> 0.8.13.202504020838</span></div></body></html> |