/
RequestListener.php
128 lines (107 loc) · 3.69 KB
/
RequestListener.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
<?php
namespace Sentry\SentryBundle\EventListener;
use Sentry\SentryBundle\SentryBundle;
use Sentry\State\HubInterface;
use Sentry\State\Scope;
use Symfony\Component\HttpKernel\Event\FilterControllerEvent;
use Symfony\Component\HttpKernel\Event\GetResponseEvent;
use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
use Symfony\Component\Security\Core\Authorization\AuthorizationCheckerInterface;
use Symfony\Component\Security\Core\Authorization\Voter\AuthenticatedVoter;
use Symfony\Component\Security\Core\User\UserInterface;
/**
* Class RequestListener
* @package Sentry\SentryBundle\EventListener
*/
final class RequestListener
{
/** @var HubInterface */
private $hub;
/** @var TokenStorageInterface|null */
private $tokenStorage;
/** @var AuthorizationCheckerInterface|null */
private $authorizationChecker;
/**
* RequestListener constructor.
* @param HubInterface $hub
* @param TokenStorageInterface|null $tokenStorage
* @param AuthorizationCheckerInterface|null $authorizationChecker
*/
public function __construct(
HubInterface $hub,
?TokenStorageInterface $tokenStorage,
?AuthorizationCheckerInterface $authorizationChecker
) {
$this->hub = $hub; // not used, needed to trigger instantiation
$this->tokenStorage = $tokenStorage;
$this->authorizationChecker = $authorizationChecker;
}
/**
* Set the username from the security context by listening on core.request
*
* @param GetResponseEvent $event
*/
public function onKernelRequest(GetResponseEvent $event): void
{
if (! $event->isMasterRequest()) {
return;
}
$currentClient = SentryBundle::getCurrentHub()->getClient();
if (null === $currentClient || ! $currentClient->getOptions()->shouldSendDefaultPii()) {
return;
}
$token = null;
if ($this->tokenStorage instanceof TokenStorageInterface) {
$token = $this->tokenStorage->getToken();
}
if (
null !== $token
&& null !== $this->authorizationChecker
&& $token->isAuthenticated()
&& $this->authorizationChecker->isGranted(AuthenticatedVoter::IS_AUTHENTICATED_REMEMBERED)
) {
$userData = $this->getUserData($token->getUser());
}
$userData['ip_address'] = $event->getRequest()->getClientIp();
SentryBundle::getCurrentHub()
->configureScope(function (Scope $scope) use ($userData): void {
$scope->setUser($userData);
});
}
public function onKernelController(FilterControllerEvent $event): void
{
if (! $event->isMasterRequest()) {
return;
}
if (! $event->getRequest()->attributes->has('_route')) {
return;
}
$matchedRoute = (string) $event->getRequest()->attributes->get('_route');
SentryBundle::getCurrentHub()
->configureScope(function (Scope $scope) use ($matchedRoute): void {
$scope->setTag('route', $matchedRoute);
});
}
/**
* @param UserInterface | object | string $user
*/
private function getUserData($user): array
{
if ($user instanceof UserInterface) {
return [
'username' => $user->getUsername(),
];
}
if (is_string($user)) {
return [
'username' => $user,
];
}
if (is_object($user) && method_exists($user, '__toString')) {
return [
'username' => $user->__toString(),
];
}
return [];
}
}