Code Coverage
 
Lines
Branches
Paths
Functions and Methods
Classes and Traits
Total
88.24% covered (warning)
88.24%
15 / 17
6.25% covered (danger)
6.25%
1 / 16
9.09% covered (danger)
9.09%
1 / 11
75.00% covered (warning)
75.00%
3 / 4
CRAP
0.00% covered (danger)
0.00%
0 / 1
EventsListener
88.24% covered (warning)
88.24%
15 / 17
6.25% covered (danger)
6.25%
1 / 16
9.09% covered (danger)
9.09%
1 / 11
75.00% covered (warning)
75.00%
3 / 4
69.86
0.00% covered (danger)
0.00%
0 / 1
 __construct
100.00% covered (success)
100.00%
2 / 2
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 loginSuccessEvent
100.00% covered (success)
100.00%
3 / 3
0.00% covered (danger)
0.00%
0 / 5
0.00% covered (danger)
0.00%
0 / 4
100.00% covered (success)
100.00%
1 / 1
3
 loginFailureEvent
0.00% covered (danger)
0.00%
0 / 2
0.00% covered (danger)
0.00%
0 / 4
0.00% covered (danger)
0.00%
0 / 2
0.00% covered (danger)
0.00%
0 / 1
6
 checkPassportEvent
100.00% covered (success)
100.00%
10 / 10
0.00% covered (danger)
0.00%
0 / 6
0.00% covered (danger)
0.00%
0 / 4
100.00% covered (success)
100.00%
1 / 1
3
1<?php
2
3namespace App\Security;
4
5use App\Application;
6use Psr\Log\LoggerInterface;
7use Symfony\Component\EventDispatcher\Attribute\AsEventListener;
8use Symfony\Component\Security\Http\Event\CheckPassportEvent;
9use Symfony\Component\Security\Http\Event\LoginFailureEvent;
10use Symfony\Component\Security\Http\Event\LoginSuccessEvent;
11
12class EventsListener
13{
14    protected Application $application;
15    protected LoggerInterface $logger;
16
17    public function __construct(Application $application, LoggerInterface $applicationLogger)
18    {
19        $this->application = $application;
20        $this->logger = $applicationLogger;
21    }
22
23    #[AsEventListener()]
24    public function loginSuccessEvent(LoginSuccessEvent $event): void
25    {
26        if (!$event->getPreviousToken() || (EnvAuthenticator::class !== get_class($event->getAuthenticator()))) {
27            /** @var User $user */
28            $user = $event->getUser();
29            $this->logger->info('Success login', $user->getAttributes());
30        }
31    }
32
33    #[AsEventListener()]
34    public function loginFailureEvent(LoginFailureEvent $event): void
35    {
36        /** @var ?User $user */
37        $user = $event->getPassport()?->getUser();
38        $this->logger->info('Login failure', $user ? $user->getAttributes() : []);
39    }
40
41    #[AsEventListener()]
42    public function checkPassportEvent(CheckPassportEvent $event): void
43    {
44        /**
45         * It is possible here to determine roles by other means such as db.
46         */
47        /** @var User $user */
48        $user = $event->getPassport()->getUser();
49        // guarantee every user at least has ROLE_USER
50        $roles = ['ROLE_USER' => 'ROLE_USER'];
51        $ginaRoles = $user->getGinaRoles();
52        $lenPrefixSamlRole = mb_strlen($this->application->getGinaRolePrefix());
53        foreach ($ginaRoles as $role) {
54            $role = mb_strtoupper(strval($role));
55            if (0 === strncmp($role, $this->application->getGinaRolePrefix(), $lenPrefixSamlRole)) {
56                $name = 'ROLE_' . mb_substr($role, $lenPrefixSamlRole);
57                $roles[$name] = $name;
58            }
59        }
60        $user->setRoles($roles);
61    }
62}