18
18
use Symfony \Component \DependencyInjection \Reference ;
19
19
use Symfony \Component \HttpFoundation \Cookie ;
20
20
21
- class RememberMeFactory implements SecurityFactoryInterface
21
+ class RememberMeFactory implements SecurityFactoryInterface, AuthenticatorFactoryInterface
22
22
{
23
23
protected $ options = [
24
24
'name ' => 'REMEMBERME ' ,
@@ -44,37 +44,15 @@ public function create(ContainerBuilder $container, string $id, array $config, ?
44
44
;
45
45
46
46
// remember me services
47
- if (isset ($ config ['service ' ])) {
48
- $ templateId = $ config ['service ' ];
49
- $ rememberMeServicesId = $ templateId .'. ' .$ id ;
50
- } elseif (isset ($ config ['token_provider ' ])) {
51
- $ templateId = 'security.authentication.rememberme.services.persistent ' ;
52
- $ rememberMeServicesId = $ templateId .'. ' .$ id ;
53
- } else {
54
- $ templateId = 'security.authentication.rememberme.services.simplehash ' ;
55
- $ rememberMeServicesId = $ templateId .'. ' .$ id ;
56
- }
47
+ $ templateId = $ this ->generateRememberMeServicesTemplateId ($ config , $ id );
48
+ $ rememberMeServicesId = $ templateId .'. ' .$ id ;
57
49
58
50
if ($ container ->hasDefinition ('security.logout_listener. ' .$ id )) {
59
51
$ container
60
52
->getDefinition ('security.logout_listener. ' .$ id )
61
- ->addMethodCall ('addHandler ' , [new Reference ($ rememberMeServicesId )])
62
- ;
63
- }
64
-
65
- $ rememberMeServices = $ container ->setDefinition ($ rememberMeServicesId , new ChildDefinition ($ templateId ));
66
- $ rememberMeServices ->replaceArgument (1 , $ config ['secret ' ]);
67
- $ rememberMeServices ->replaceArgument (2 , $ id );
68
-
69
- if (isset ($ config ['token_provider ' ])) {
70
- $ rememberMeServices ->addMethodCall ('setTokenProvider ' , [
71
- new Reference ($ config ['token_provider ' ]),
72
- ]);
53
+ ->addMethodCall ('addHandler ' , [new Reference ($ rememberMeServicesId )]);
73
54
}
74
55
75
- // remember-me options
76
- $ rememberMeServices ->replaceArgument (3 , array_intersect_key ($ config , $ this ->options ));
77
-
78
56
// attach to remember-me aware listeners
79
57
$ userProviders = [];
80
58
foreach ($ container ->findTaggedServiceIds ('security.remember_me_aware ' ) as $ serviceId => $ attributes ) {
@@ -98,17 +76,8 @@ public function create(ContainerBuilder $container, string $id, array $config, ?
98
76
;
99
77
}
100
78
}
101
- if ($ config ['user_providers ' ]) {
102
- $ userProviders = [];
103
- foreach ($ config ['user_providers ' ] as $ providerName ) {
104
- $ userProviders [] = new Reference ('security.user.provider.concrete. ' .$ providerName );
105
- }
106
- }
107
- if (0 === \count ($ userProviders )) {
108
- throw new \RuntimeException ('You must configure at least one remember-me aware listener (such as form-login) for each firewall that has remember-me enabled. ' );
109
- }
110
79
111
- $ rememberMeServices -> replaceArgument ( 0 , new IteratorArgument ( array_unique ( $ userProviders)) );
80
+ $ this -> createRememberMeServices ( $ container , $ id , $ templateId , $ userProviders, $ config );
112
81
113
82
// remember-me listener
114
83
$ listenerId = 'security.authentication.listener.rememberme. ' .$ id ;
@@ -119,6 +88,28 @@ public function create(ContainerBuilder $container, string $id, array $config, ?
119
88
return [$ authProviderId , $ listenerId , $ defaultEntryPoint ];
120
89
}
121
90
91
+ public function createAuthenticator (ContainerBuilder $ container , string $ id , array $ config , ?string $ userProviderId ): string
92
+ {
93
+ $ templateId = $ this ->generateRememberMeServicesTemplateId ($ config , $ id );
94
+ $ rememberMeServicesId = $ templateId .'. ' .$ id ;
95
+
96
+ // create remember me services (which manage the remember me cookies)
97
+ $ this ->createRememberMeServices ($ container , $ id , $ templateId , [new Reference ('security.user_providers ' )], $ config );
98
+
99
+ // create remember me listener (which executes the remember me services for other authenticators)
100
+ $ this ->createRememberMeListener ($ container , $ id , $ rememberMeServicesId );
101
+
102
+ // create remember me authenticator (which re-authenticates the user based on the remember me cookie)
103
+ $ authenticatorId = 'security.authenticator.remember_me. ' .$ id ;
104
+ $ container
105
+ ->setDefinition ($ authenticatorId , new ChildDefinition ('security.authenticator.remember_me ' ))
106
+ ->replaceArgument (0 , new Reference ($ rememberMeServicesId ))
107
+ ->replaceArgument (3 , array_intersect_key ($ config , $ this ->options ))
108
+ ;
109
+
110
+ return $ authenticatorId ;
111
+ }
112
+
122
113
public function getPosition ()
123
114
{
124
115
return 'remember_me ' ;
@@ -161,4 +152,57 @@ public function addConfiguration(NodeDefinition $node)
161
152
}
162
153
}
163
154
}
155
+
156
+ private function generateRememberMeServicesTemplateId (array $ config , string $ id ): string
157
+ {
158
+ if (isset ($ config ['service ' ])) {
159
+ return $ config ['service ' ];
160
+ }
161
+
162
+ if (isset ($ config ['token_provider ' ])) {
163
+ return 'security.authentication.rememberme.services.persistent ' ;
164
+ }
165
+
166
+ return 'security.authentication.rememberme.services.simplehash ' ;
167
+ }
168
+
169
+ private function createRememberMeServices (ContainerBuilder $ container , string $ id , string $ templateId , array $ userProviders , array $ config ): void
170
+ {
171
+ $ rememberMeServicesId = $ templateId .'. ' .$ id ;
172
+
173
+ $ rememberMeServices = $ container ->setDefinition ($ rememberMeServicesId , new ChildDefinition ($ templateId ));
174
+ $ rememberMeServices ->replaceArgument (1 , $ config ['secret ' ]);
175
+ $ rememberMeServices ->replaceArgument (2 , $ id );
176
+
177
+ if (isset ($ config ['token_provider ' ])) {
178
+ $ rememberMeServices ->addMethodCall ('setTokenProvider ' , [
179
+ new Reference ($ config ['token_provider ' ]),
180
+ ]);
181
+ }
182
+
183
+ // remember-me options
184
+ $ rememberMeServices ->replaceArgument (3 , array_intersect_key ($ config , $ this ->options ));
185
+
186
+ if ($ config ['user_providers ' ]) {
187
+ $ userProviders = [];
188
+ foreach ($ config ['user_providers ' ] as $ providerName ) {
189
+ $ userProviders [] = new Reference ('security.user.provider.concrete. ' .$ providerName );
190
+ }
191
+ }
192
+
193
+ if (0 === \count ($ userProviders )) {
194
+ throw new \RuntimeException ('You must configure at least one remember-me aware listener (such as form-login) for each firewall that has remember-me enabled. ' );
195
+ }
196
+
197
+ $ rememberMeServices ->replaceArgument (0 , new IteratorArgument (array_unique ($ userProviders )));
198
+ }
199
+
200
+ private function createRememberMeListener (ContainerBuilder $ container , string $ id , string $ rememberMeServicesId ): void
201
+ {
202
+ $ container
203
+ ->setDefinition ('security.listener.remember_me. ' .$ id , new ChildDefinition ('security.listener.remember_me ' ))
204
+ ->replaceArgument (0 , new Reference ($ rememberMeServicesId ))
205
+ ->replaceArgument (1 , $ id )
206
+ ;
207
+ }
164
208
}
0 commit comments