Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
0.00% covered (danger)
0.00%
0 / 26
0.00% covered (danger)
0.00%
0 / 4
CRAP
0.00% covered (danger)
0.00%
0 / 1
LoginFormAuthenticator
0.00% covered (danger)
0.00%
0 / 26
0.00% covered (danger)
0.00%
0 / 4
56
0.00% covered (danger)
0.00%
0 / 1
 __construct
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
 authenticate
0.00% covered (danger)
0.00%
0 / 19
0.00% covered (danger)
0.00%
0 / 1
12
 onAuthenticationSuccess
0.00% covered (danger)
0.00%
0 / 5
0.00% covered (danger)
0.00%
0 / 1
6
 getLoginUrl
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
1<?php
2
3namespace App\Security;
4
5use App\Exception\UserNotVerifiedException;
6use App\Repository\UserRepository;
7use Symfony\Component\HttpFoundation\RedirectResponse;
8use Symfony\Component\HttpFoundation\Request;
9use Symfony\Component\HttpFoundation\Response;
10use Symfony\Component\Routing\RouterInterface;
11use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
12use Symfony\Component\Security\Core\Exception\CustomUserMessageAuthenticationException;
13use Symfony\Component\Security\Core\Exception\UserNotFoundException;
14use Symfony\Component\Security\Core\Security;
15use Symfony\Component\Security\Http\Authenticator\AbstractLoginFormAuthenticator;
16use Symfony\Component\Security\Http\Authenticator\Passport\Badge\CsrfTokenBadge;
17use Symfony\Component\Security\Http\Authenticator\Passport\Badge\RememberMeBadge;
18use Symfony\Component\Security\Http\Authenticator\Passport\Badge\UserBadge;
19use Symfony\Component\Security\Http\Authenticator\Passport\Credentials\PasswordCredentials;
20use Symfony\Component\Security\Http\Authenticator\Passport\Passport;
21use Symfony\Component\Security\Http\Util\TargetPathTrait;
22
23/**
24 *
25 */
26class LoginFormAuthenticator extends AbstractLoginFormAuthenticator
27{
28    use TargetPathTrait;
29
30    public function __construct(private readonly UserRepository $userRepository, private readonly RouterInterface $router)
31    {
32        // empty body
33    }
34
35    public function authenticate(Request $request): Passport
36    {
37        $username = $request->request->get(key: 'username');
38        $password = $request->request->get(key: 'password');
39        $csrfToken = $request->request->get(key: '_csrf_token');
40
41        $request->getSession()->set(name: Security::LAST_USERNAME, value: $username);
42
43        return new Passport(
44            userBadge: new UserBadge(userIdentifier: $username, userLoader: function ($username) {
45                $user = $this->userRepository->findOneBy(['username' => $username]);
46
47                if (!$user) {
48                    $user = $this->userRepository->findOneBy(['email' => $username]);
49                }
50
51                if (!$user) {
52                    throw new UserNotFoundException();
53                }
54
55                return $user;
56            }),
57
58            credentials: new PasswordCredentials(password: $password),
59            badges: [
60                new CsrfTokenBadge(csrfTokenId: 'authenticate', csrfToken: $csrfToken),
61                new RememberMeBadge(),
62            ]
63        );
64    }
65
66    public function onAuthenticationSuccess(Request $request, TokenInterface $token, string $firewallName): ?Response
67    {
68        if ($target = $this->getTargetPath(session: $request->getSession(), firewallName: $firewallName)) {
69            return new RedirectResponse(url: $target);
70        }
71
72        return new RedirectResponse(
73            url: $this->router->generate(name: 'app_main')
74        );
75    }
76
77    protected function getLoginUrl(Request $request): string
78    {
79        return $this->router->generate(name: 'security_login');
80    }
81
82}