Completed
Push — ezp-30928-as_a_developer_i_wan... ( b10e65 )
by
unknown
33:52 queued 18:51
created

setPermissionResolver()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 4

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
nc 1
nop 1
dl 0
loc 4
rs 10
c 0
b 0
f 0
1
<?php
2
3
/**
4
 * File containing the RepositoryAuthenticationProvider class.
5
 *
6
 * @copyright Copyright (C) eZ Systems AS. All rights reserved.
7
 * @license For full copyright and license information view LICENSE file distributed with this source code.
8
 */
9
namespace eZ\Publish\Core\MVC\Symfony\Security\Authentication;
10
11
use eZ\Publish\API\Repository\Exceptions\NotFoundException;
12
use eZ\Publish\API\Repository\PermissionResolver;
13
use eZ\Publish\API\Repository\Repository;
14
use eZ\Publish\API\Repository\UserService;
15
use eZ\Publish\Core\MVC\Symfony\Security\UserInterface as EzUserInterface;
16
use eZ\Publish\Core\Repository\Values\User\UserReference;
17
use Symfony\Component\Security\Core\Authentication\Provider\DaoAuthenticationProvider;
18
use Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken;
19
use Symfony\Component\Security\Core\Exception\BadCredentialsException;
20
use Symfony\Component\Security\Core\User\UserInterface;
21
22
class RepositoryAuthenticationProvider extends DaoAuthenticationProvider
23
{
24
    /** @var \eZ\Publish\API\Repository\PermissionResolver */
25
    private $permissionResolver;
26
27
    /** @var \eZ\Publish\API\Repository\UserService */
28
    private $userService;
29
30
    public function setPermissionResolver(PermissionResolver $permissionResolver)
31
    {
32
        $this->permissionResolver = $permissionResolver;
33
    }
34
35
    public function setUserService(UserService $userService)
36
    {
37
        $this->userService = $userService;
38
    }
39
40
    protected function checkAuthentication(UserInterface $user, UsernamePasswordToken $token)
41
    {
42
        if (!$user instanceof EzUserInterface) {
43
            return parent::checkAuthentication($user, $token);
44
        }
45
46
        // $currentUser can either be an instance of UserInterface or just the username (e.g. during form login).
47
        /** @var EzUserInterface|string $currentUser */
48
        $currentUser = $token->getUser();
49
        if ($currentUser instanceof UserInterface) {
50
            if ($currentUser->getAPIUser()->passwordHash !== $user->getAPIUser()->passwordHash) {
51
                throw new BadCredentialsException('The credentials were changed from another session.');
52
            }
53
54
            $apiUser = $currentUser->getAPIUser();
55
        } else {
56
            try {
57
                $apiUser = $this->userService->loadUserByCredentials($token->getUsername(), $token->getCredentials());
58
            } catch (NotFoundException $e) {
59
                throw new BadCredentialsException('Invalid credentials', 0, $e);
60
            }
61
        }
62
63
        // Finally inject current user in the Repository
64
        $this->permissionResolver->setCurrentUserReference($apiUser);
65
    }
66
}
67