Completed
Pull Request — development (#798)
by Nick
04:43
created

UserVoter::voteOnAttribute()   A

Complexity

Conditions 5
Paths 6

Size

Total Lines 31

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 5
nc 6
nop 3
dl 0
loc 31
rs 9.1128
c 0
b 0
f 0
1
<?php
2
3
namespace Oc\Security\Voter;
4
5
use Oc\Entity\UserEntity;
6
use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
7
use Symfony\Component\Security\Core\Authorization\AccessDecisionManagerInterface;
8
use Symfony\Component\Security\Core\Authorization\Voter\Voter;
9
use Symfony\Component\Security\Core\User\UserInterface;
10
11
class UserVoter extends Voter
12
{
13
    /**
14
     * @var AccessDecisionManagerInterface
15
     */
16
    private $accessDecisionManager;
17
18
    public function __construct(AccessDecisionManagerInterface $accessDecisionManager)
19
    {
20
        $this->accessDecisionManager = $accessDecisionManager;
21
    }
22
23
    protected function supports($attribute, $subject): bool
24
    {
25
        return in_array($attribute, ['CAN_VIEW'])
26
            && ($subject instanceof UserEntity || $subject === UserEntity::class);
27
    }
28
29
    protected function voteOnAttribute($attribute, $subject, TokenInterface $token)
30
    {
31
        $user = $token->getUser();
32
        // if the user is anonymous, do not grant access
33
        if (!$user instanceof UserInterface) {
34
            return false;
35
        }
36
37
        $grantingRoles = [
38
            'ROLE_SUPER_ADMIN',
39
            'ROLE_ADMIN',
40
            'ROLE_SUPPORT_HEAD',
41
            'ROLE_SOCIAL_HEAD',
42
            'ROLE_DEVELOPER_HEAD',
43
        ];
44
45
        foreach ($grantingRoles as $grantingRole) {
46
            if ($this->accessDecisionManager->decide($token, [$grantingRole])) {
47
                return true;
48
            }
49
        }
50
51
        switch ($attribute) {
52
            case 'CAN_VIEW':
53
                // logic to determine if the user can EDIT
54
                // return true or false
55
                break;
56
        }
57
58
        return false;
59
    }
60
}
61