13
13
14
14
use Psr \Log \LoggerInterface ;
15
15
use Symfony \Component \EventDispatcher \EventDispatcherInterface ;
16
+ use Symfony \Component \HttpFoundation \Request ;
17
+ use Symfony \Component \HttpFoundation \Sess
8000
ion \Session ;
16
18
use Symfony \Component \HttpKernel \Event \FilterResponseEvent ;
17
19
use Symfony \Component \HttpKernel \Event \RequestEvent ;
18
20
use Symfony \Component \HttpKernel \KernelEvents ;
@@ -49,11 +51,12 @@ class ContextListener implements ListenerInterface
49
51
private $ dispatcher ;
50
52
private $ registered ;
51
53
private $ trustResolver ;
54
+ private $ sessionTrackerEnabler ;
52
55
53
56
/**
54
57
* @param iterable|UserProviderInterface[] $userProviders
55
58
*/
56
- public function __construct (TokenStorageInterface $ tokenStorage , iterable $ userProviders , string $ contextKey , LoggerInterface $ logger = null , EventDispatcherInterface $ dispatcher = null , AuthenticationTrustResolverInterface $ trustResolver = null )
59
+ public function __construct (TokenStorageInterface $ tokenStorage , iterable $ userProviders , string $ contextKey , LoggerInterface $ logger = null , EventDispatcherInterface $ dispatcher = null , AuthenticationTrustResolverInterface $ trustResolver = null , callable $ sessionTrackerEnabler = null )
57
60
{
58
61
if (empty ($ contextKey )) {
59
62
throw new \InvalidArgumentException ('$contextKey must not be empty. ' );
@@ -65,6 +68,7 @@ public function __construct(TokenStorageInterface $tokenStorage, iterable $userP
65
68
$ this ->logger = $ logger ;
66
69
$ this ->dispatcher = $ dispatcher ;
67
70
$ this ->trustResolver = $ trustResolver ?: new AuthenticationTrustResolver (AnonymousToken::class, RememberMeToken::class);
71
+ $ this ->sessionTrackerEnabler = $ sessionTrackerEnabler ;
68
72
}
69
73
70
74
/**
@@ -92,7 +96,21 @@ public function __invoke(RequestEvent $event)
92
96
$ request = $ event ->getRequest ();
93
97
$ session = $ request ->hasPreviousSession () && $ request ->hasSession () ? $ request ->getSession () : null ;
94
98
95
- if (null === $ session || null === $ token = $ session ->get ($ this ->sessionKey )) {
99
+ if (null !== $ session ) {
100
+ $ usageIndexValue = method_exists (Request::class, 'getPreferredFormat ' ) && $ session instanceof Session ? $ usageIndexReference = &$ session ->getUsageIndex () : 0 ;
101
+ $ sessionId = $ session ->getId ();
102
+ $ token = $ session ->get ($ this ->sessionKey );
103
+
104
+ if ($ this ->sessionTrackerEnabler && $ session ->getId () === $ sessionId ) {
105
+ $ usageIndexReference = $ usageIndexValue ;
106
+ }
107
+ }
108
+
109
+ if (null === $ session || null === $ token ) {
110
+ if ($ this ->sessionTrackerEnabler ) {
6D40
111
+ ($ this ->sessionTrackerEnabler )();
112
+ }
113
+
96
114
$ this ->tokenStorage ->setToken (null );
97
115
98
116
return ;
@@ -117,6 +135,10 @@ public function __invoke(RequestEvent $event)
117
135
$ token = null ;
118
136
}
119
137
138
+ if ($ this ->sessionTrackerEnabler ) {
139
+ ($ this ->sessionTrackerEnabler )();
140
+ }
141
+
120
142
$ this ->tokenStorage ->setToken ($ token );
121
143
}
122
144
@@ -137,19 +159,26 @@ public function onKernelResponse(FilterResponseEvent $event)
137
159
138
160
$ this ->dispatcher ->removeListener (KernelEvents::RESP
9E88
ONSE , [$ this , 'onKernelResponse ' ]);
139
161
$ this ->registered = false ;
162
+ $ session = $ request ->getSession ();
163
+ $ sessionId = $ session ->getId ();
164
+ $ usageIndexValue = method_exists (Request::class, 'getPreferredFormat ' ) && $ session instanceof Session ? $ usageIndexReference = &$ session ->getUsageIndex () : null ;
140
165
$ token = $ this ->tokenStorage ->getToken ();
141
166
142
167
if (null === $ token || $ this ->trustResolver ->isAnonymous ($ token )) {
143
- if ($ request ->hasPreviousSession () && $ request -> hasSession () ) {
144
- $ request -> getSession () ->remove ($ this ->sessionKey );
168
+ if ($ request ->hasPreviousSession ()) {
169
+ $ session ->remove ($ this ->sessionKey );
145
170
}
146
171
} else {
147
- $ request -> getSession () ->set ($ this ->sessionKey , serialize ($ token ));
172
+ $ session ->set ($ this ->sessionKey , serialize ($ token ));
148
173
149
174
if (null !== $ this ->logger ) {
150
175
$ this ->logger ->debug ('Stored the security token in the session. ' , ['key ' => $ this ->sessionKey ]);
151
176
}
152
177
}
178
+
179
+ if ($ this ->sessionTrackerEnabler && $ session ->getId () === $ sessionId ) {
180
+ $ usageIndexReference = $ usageIndexValue ;
181
+ }
153
182
}
154
183
155
184
/**
F438
0 commit comments