Vendor: SSO: Add stevenmaguire/oauth2-keycloak + implement keycloak login/registration - refs BT#21881
parent
007d59dc65
commit
227076163d
@ -0,0 +1,26 @@ |
||||
<?php |
||||
|
||||
/* For licensing terms, see /license.txt */ |
||||
|
||||
declare(strict_types=1); |
||||
|
||||
namespace Chamilo\CoreBundle\Controller\OAuth2; |
||||
|
||||
use Chamilo\CoreBundle\ServiceHelper\AuthenticationConfigHelper; |
||||
use KnpU\OAuth2ClientBundle\Client\ClientRegistry; |
||||
use Symfony\Component\HttpFoundation\Response; |
||||
use Symfony\Component\Routing\Attribute\Route; |
||||
|
||||
class KeycloakProviderController extends AbstractProviderController |
||||
{ |
||||
#[Route('/connect/keycloak', name: 'chamilo.oauth2_keycloak_start')] |
||||
public function connect( |
||||
ClientRegistry $clientRegistry, |
||||
AuthenticationConfigHelper $authenticationConfigHelper, |
||||
): Response { |
||||
return $this->getStartResponse('keycloak', $clientRegistry, $authenticationConfigHelper); |
||||
} |
||||
|
||||
#[Route('/connect/keycloak/check', name: 'chamilo.oauth2_keycloak_check')] |
||||
public function connectCheck(): void {} |
||||
} |
@ -0,0 +1,57 @@ |
||||
<?php |
||||
|
||||
/* For licensing terms, see /license.txt */ |
||||
|
||||
declare(strict_types=1); |
||||
|
||||
namespace Chamilo\CoreBundle\Security\Authenticator\OAuth2; |
||||
|
||||
use Chamilo\CoreBundle\Entity\User; |
||||
use KnpU\OAuth2ClientBundle\Client\OAuth2ClientInterface; |
||||
use League\OAuth2\Client\Token\AccessToken; |
||||
use Stevenmaguire\OAuth2\Client\Provider\KeycloakResourceOwner; |
||||
use Symfony\Component\HttpFoundation\Request; |
||||
|
||||
class KeycloakAuthenticator extends AbstractAuthenticator |
||||
{ |
||||
protected string $providerName = 'keycloak'; |
||||
|
||||
public function supports(Request $request): ?bool |
||||
{ |
||||
return 'chamilo.oauth2_keycloak_check' === $request->attributes->get('_route'); |
||||
} |
||||
|
||||
protected function userLoader(AccessToken $accessToken): User |
||||
{ |
||||
/** @var KeycloakResourceOwner $resourceOwner */ |
||||
$resourceOwner = $this->client->fetchUserFromToken($accessToken); |
||||
|
||||
$user = $this->userRepository->findOneBy(['username' => $resourceOwner->getUsername()]) |
||||
?: |
||||
$this->userRepository->findOneBy(['username' => $resourceOwner->getId()]); |
||||
|
||||
if (!$user) { |
||||
$user = (new User()) |
||||
->setCreatorId($this->userRepository->getRootUser()->getId()) |
||||
; |
||||
} |
||||
|
||||
$username = $resourceOwner->getUsername() ?: $resourceOwner->getId(); |
||||
|
||||
$user |
||||
->setFirstname($resourceOwner->getFirstName()) |
||||
->setLastname($resourceOwner->getLastName()) |
||||
->setEmail($resourceOwner->getEmail()) |
||||
->setUsername($username) |
||||
->setPlainPassword('keycloak') |
||||
->setStatus(STUDENT) |
||||
->setAuthSource('keycloak') |
||||
->setRoleFromStatus(STUDENT) |
||||
; |
||||
|
||||
$this->userRepository->updateUser($user); |
||||
// updateAccessUrls ? |
||||
|
||||
return $user; |
||||
} |
||||
} |
Loading…
Reference in new issue