Passed
Pull Request — master (#5753)
by Angel Fernando Quiroz
07:49
created

KeycloakAuthenticator::supports()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 3
Code Lines 1

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 1
Metric Value
cc 1
eloc 1
c 1
b 0
f 1
nc 1
nop 1
dl 0
loc 3
rs 10
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 League\OAuth2\Client\Token\AccessToken;
11
use Stevenmaguire\OAuth2\Client\Provider\KeycloakResourceOwner;
12
use Symfony\Component\HttpFoundation\Request;
13
14
class KeycloakAuthenticator extends AbstractAuthenticator
15
{
16
    protected string $providerName = 'keycloak';
17
18
    public function supports(Request $request): ?bool
19
    {
20
        return 'chamilo.oauth2_keycloak_check' === $request->attributes->get('_route');
21
    }
22
23
    protected function userLoader(AccessToken $accessToken): User
24
    {
25
        /** @var KeycloakResourceOwner $resourceOwner */
26
        $resourceOwner = $this->client->fetchUserFromToken($accessToken);
27
28
        $user = $this->userRepository->findOneBy(['username' => $resourceOwner->getUsername()])
29
            ?:
30
            $this->userRepository->findOneBy(['username' => $resourceOwner->getId()]);
31
32
        if (!$user) {
33
            $user = (new User())
34
                ->setCreatorId($this->userRepository->getRootUser()->getId())
35
            ;
36
        }
37
38
        $username = $resourceOwner->getUsername() ?: $resourceOwner->getId();
39
40
        $user
41
            ->setFirstname($resourceOwner->getFirstName())
42
            ->setLastname($resourceOwner->getLastName())
43
            ->setEmail($resourceOwner->getEmail())
44
            ->setUsername($username)
45
            ->setPlainPassword('keycloak')
46
            ->setStatus(STUDENT)
47
            ->setAuthSource('keycloak')
48
            ->setRoleFromStatus(STUDENT)
49
        ;
50
51
        $this->userRepository->updateUser($user);
52
53
        $url = $this->urlHelper->getCurrent();
54
        $url->addUser($user);
55
56
        return $user;
57
    }
58
}
59