findUser($payload); if ($user) { $this->syncUser($user, $payload); return $user; } return $this->tryToCreateUser($payload); } private function findUser(Payload $payload): ?User { $usernameClaim = $this->config->get('oidcUsernameClaim'); if (!$usernameClaim) { throw new RuntimeException("No username claim in config."); } $username = $payload->get($usernameClaim); if (!$username) { throw new RuntimeException("No username claim `{$usernameClaim}` in token."); } $username = $this->sync->normalizeUsername($username); /** @var ?User $user */ $user = $this->entityManager ->getRDBRepositoryByClass(User::class) ->where(['userName' => $username]) ->findOne(); if (!$user) { return null; } if (!$user->isActive()) { return null; } if (!$user->isRegular() && !$user->isAdmin()) { return null; } if ($user->isSuperAdmin()) { return null; } if ($user->isAdmin() && !$this->config->get('oidcAllowAdminUser')) { return null; } return $user; } private function tryToCreateUser(Payload $payload): ?User { if (!$this->config->get('oidcCreateUser')) { return null; } $usernameClaim = $this->config->get('oidcUsernameClaim'); if (!$usernameClaim) { throw new RuntimeException("Could not create a user. No OIDC username claim in config."); } $username = $payload->get($usernameClaim); if (!$username) { throw new RuntimeException("Could not create a user. No username claim returned in token."); } return $this->sync->createUser($payload); } private function syncUser(User $user, Payload $payload): void { if (!$this->config->get('oidcSync') && !$this->config->get('oidcSyncTeams')) { return; } $this->sync->syncUser($user, $payload); } }