Passed
Pull Request — master (#5753)
by Angel Fernando Quiroz
08:44
created

KeycloakAuthenticator   A

Complexity

Total Complexity 5

Size/Duplication

Total Lines 41
Duplicated Lines 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
eloc 21
c 1
b 0
f 0
dl 0
loc 41
rs 10
wmc 5

2 Methods

Rating   Name   Duplication   Size   Complexity  
A supports() 0 3 1
A userLoader() 0 32 4
1
<?php
2
3
/* For licensing terms, see /license.txt */
4
5
declare(strict_types=1);
6
7
namespace Chamilo\CoreBundle\Security\Authenticator\OAuth2;
8
9
use Chamilo\CoreBundle\Entity\User;
10
use KnpU\OAuth2ClientBundle\Client\OAuth2ClientInterface;
11
use League\OAuth2\Client\Token\AccessToken;
12
use Stevenmaguire\OAuth2\Client\Provider\KeycloakResourceOwner;
13
use Symfony\Component\HttpFoundation\Request;
14
15
class KeycloakAuthenticator extends AbstractAuthenticator
16
{
17
    protected string $providerName = 'keycloak';
18
19
    public function supports(Request $request): ?bool
20
    {
21
        return 'chamilo.oauth2_keycloak_check' === $request->attributes->get('_route');
22
    }
23
24
    protected function userLoader(AccessToken $accessToken): User
25
    {
26
        /** @var KeycloakResourceOwner $resourceOwner */
27
        $resourceOwner = $this->client->fetchUserFromToken($accessToken);
28
29
        $user = $this->userRepository->findOneBy(['username' => $resourceOwner->getUsername()])
30
            ?:
31
            $this->userRepository->findOneBy(['email' => $resourceOwner->getEmail()]);
32
33
        if (!$user) {
34
            $user = (new User())
35
                ->setCreatorId($this->userRepository->getRootUser()->getId())
36
            ;
37
        }
38
39
        $username = $user->getUsername() ?: $user->getEmail();
40
41
        $user
42
            ->setFirstname($resourceOwner->getFirstName())
43
            ->setLastname($resourceOwner->getLastName())
44
            ->setEmail($resourceOwner->getEmail())
45
            ->setUsername($username)
46
            ->setPlainPassword('keycloak')
47
            ->setStatus(STUDENT)
48
            ->setAuthSource('keycloak')
49
            ->setRoleFromStatus(STUDENT)
50
        ;
51
52
        $this->userRepository->updateUser($user);
53
        // updateAccessUrls ?
54
55
        return $user;
56
    }
57
}
58