@@ -77,24 +77,15 @@ the user provider uses :doc:`Doctrine </doctrine>` to retrieve them.
77
77
use App\Entity\User;
78
78
use Symfony\Config\SecurityConfig;
79
79
80
- $container->loadFromExtension('security', [
81
- 'providers' => [
82
- 'users' => [
83
- 'entity' => [
84
- // the class of the entity that represents users
85
- 'class' => User::class,
86
- // the property to query by - e.g. email, username, etc
87
- 'property' => 'email',
88
-
89
- // optional: if you're using multiple Doctrine entity
90
- // managers, this option defines which one to use
91
- //'manager_name' => 'customer',
92
- ],
93
- ],
94
- ],
95
-
80
+ return static function (SecurityConfig $security): void {
96
81
// ...
97
- ]);
82
+
83
+ $security->provider('app_user_provider')
84
+ ->entity()
85
+ ->class(User::class)
86
+ ->property('email')
87
+ ;
88
+ };
98
89
99
90
.. _authenticating-someone-with-a-custom-entity-provider :
100
91
@@ -174,18 +165,16 @@ To finish this, remove the ``property`` key from the user provider in
174
165
175
166
// config/packages/security.php
176
167
use App\Entity\User;
168
+ use Symfony\Config\SecurityConfig;
177
169
178
- $container->loadFromExtension('security', [
179
- 'providers' => [
180
- 'users' => [
181
- 'entity' => [
182
- 'class' => User::class,
183
- ],
184
- ],
185
- ],
186
-
170
+ return static function (SecurityConfig $security): void {
187
171
// ...
188
- ]);
172
+
173
+ $security->provider('app_user_provider')
174
+ ->entity()
175
+ ->class(User::class)
176
+ ;
177
+ };
189
178
190
179
Now, whenever Symfony uses the user provider, the ``loadUserByIdentifier() ``
191
180
method on your ``UserRepository `` will be called.
@@ -206,18 +195,67 @@ including their passwords. Make sure the passwords are hashed properly. See
206
195
After setting up hashing, you can configure all the user information in
207
196
``security.yaml ``:
208
197
209
- .. code -block :: yaml
198
+ .. configuration -block ::
210
199
211
- # config/packages/security.yaml
212
- security :
213
- providers :
214
- backend_users :
215
- memory :
216
- users :
217
- john_admin : { password: '$2y$13$jxGxc ... IuqDju', roles: ['ROLE_ADMIN'] }
218
- jane_admin : { password: '$2y$13$PFi1I ... rGwXCZ', roles: ['ROLE_ADMIN', 'ROLE_SUPER_ADMIN'] }
200
+ .. code-block :: yaml
219
201
220
- # ...
202
+ # config/packages/security.yaml
203
+ security :
204
+ providers :
205
+ backend_users :
206
+ memory :
207
+ users :
208
+ john_admin : { password: '$2y$13$jxGxc ... IuqDju', roles: ['ROLE_ADMIN'] }
209
+ jane_admin : { password: '$2y$13$PFi1I ... rGwXCZ', roles: ['ROLE_ADMIN', 'ROLE_SUPER_ADMIN'] }
210
+
211
+ # ...
212
+
213
+ .. code-block :: xml
214
+
215
+ <!-- config/packages/security.xml -->
216
+ <?xml version =" 1.0" encoding =" UTF-8" ?>
217
+ <srv : container xmlns =" http://symfony.com/schema/dic/security"
218
+ xmlns : xsi =" http://www.w3.org/2001/XMLSchema-instance"
219
+ xmlns : srv =" http://symfony.com/schema/dic/services"
220
+ xsi : schemaLocation =" http://symfony.com/schema/dic/services
221
+ https://symfony.com/schema/dic/services/services-1.0.xsd
222
+ http://symfony.com/schema/dic/security
223
+ https://symfony.com/schema/dic/security/security-1.0.xsd" >
224
+
225
+ <config >
226
+ <!-- ... -->
227
+
228
+ <provider name =" app_user_provider2" >
229
+ <memory >
230
+ <user identifier =" john_admin" password =" $2y$13$jxGxc ... IuqDju" roles =" ROLE_ADMIN" />
231
+ <user identifier =" jane_admin" password =" $2y$13$PFi1I ... rGwXCZ" roles =" ROLE_ADMIN, ROLE_SUPER_ADMIN" />
232
+ </memory >
233
+ </provider >
234
+ </config >
235
+ </srv : container >
236
+
237
+ .. code-block :: php
238
+
239
+ // config/packages/security.php
240
+ use App\Entity\User;
241
+ use Symfony\Config\SecurityConfig;
242
+
243
+ return static function (SecurityConfig $security): void {
244
+ // ...
245
+
246
+ $memoryProvider = $security->provider('app_user_provider')->memory();
247
+ $memoryProvider
248
+ ->user('john_admin')
249
+ ->password('$2y$13$jxGxc ... IuqDju')
250
+ ->roles(['ROLE_ADMIN'])
251
+ ;
252
+
253
+ $memoryProvider
254
+ ->user('jane_admin')
255
+ ->password('$2y$13$PFi1I ... rGwXCZ')
256
+ ->roles(['ROLE_ADMIN', 'ROLE_SUPER_ADMIN'])
257
+ ;
258
+ };
221
259
222
260
.. caution ::
223
261
@@ -235,27 +273,99 @@ providers are configured is important because Symfony will look for users
235
273
starting from the first provider and will keep looking for in the other
236
274
providers until the user is found:
237
275
238
- .. code-block :: yaml
276
+ .. configuration-block ::
277
+
278
+ .. code-block :: yaml
279
+
280
+ # config/packages/security.yaml
281
+ security :
282
+ # ...
283
+ providers :
284
+ backend_users :
285
+ ldap :
286
+ # ...
287
+
288
+ legacy_users :
289
+ entity :
290
+ # ...
239
291
240
- # config/packages/security.yaml
241
- security :
242
- # ...
243
- providers :
244
- backend_users :
245
- ldap :
246
- # ...
292
+ users :
293
+ entity :
294
+ # ...
247
295
248
- legacy_users :
249
- entity :
250
- # ...
296
+ all_users :
297
+ chain :
298
+ providers : ['legacy_users', 'users', 'backend_users']
251
299
252
- users :
253
- entity :
254
- # ...
300
+ .. code-block :: xml
255
301
256
- all_users :
257
- chain :
258
- providers : ['legacy_users', 'users', 'backend_users']
302
+ <!-- config/packages/security.xml -->
303
+ <?xml version =" 1.0" encoding =" UTF-8" ?>
304
+ <srv : container xmlns =" http://symfony.com/schema/dic/security"
305
+ xmlns : xsi =" http://www.w3.org/2001/XMLSchema-instance"
306
+ xmlns : srv =" http://symfony.com/schema/dic/services"
307
+ xsi : schemaLocation =" http://symfony.com/schema/dic/services
308
+ https://symfony.com/schema/dic/services/services-1.0.xsd
309
+ http://symfony.com/schema/dic/security
310
+ https://symfony.com/schema/dic/security/security-1.0.xsd" >
311
+
312
+ <config >
313
+ <!-- ... -->
314
+
315
+ <provider name =" backend_users" >
316
+ <ldap service =" ..." base-dn =" ..." />
317
+ </provider >
318
+
319
+ <provider name =" legacy_users" >
320
+ <entity >
321
+ <!-- ... -->
322
+ </entity >
323
+ </provider >
324
+
325
+ <provider name =" users" >
326
+ <entity >
327
+ <!-- ... -->
328
+ </entity >
329
+ </provider >
330
+
331
+ <provider name =" all_users" >
332
+ <chain >
333
+ <provider >backend_users</provider >
334
+ <provider >legacy_users</provider >
335
+ <provider >users</provider >
336
+ </chain >
337
+ </provider >
338
+ </config >
339
+ </srv : container >
340
+
341
+ .. code-block :: php
342
+
343
+ // config/packages/security.php
344
+ use App\Entity\User;
345
+ use Symfony\Config\SecurityConfig;
346
+
347
+ return static function (SecurityConfig $security): void {
348
+ // ...
349
+
350
+ $backendProvider = $security->provider('backend_users')
351
+ ->ldap()
352
+ // ...
353
+ ;
354
+
355
+ $legacyProvider = $security->provider('legacy_users')
356
+ ->entity()
357
+ // ...
358
+ ;
359
+
360
+ $userProvider = $security->provider('users')
361
+ ->entity()
362
+ // ...
363
+ ;
364
+
365
+ $allProviders = $security->provider('all_users')->chain()
366
+ ->providers([$backendProvider, $legacyProvider, $userProvider])
367
+ ;
368
+ };
259
369
260
370
.. _security-custom-user-provider :
261
371
@@ -346,14 +456,52 @@ Most of the work is already done! Read the comments in the code and update the
346
456
TODO sections to finish the user provider. When you're done, tell Symfony about
347
457
the user provider by adding it in ``security.yaml ``:
348
458
349
- .. code-block :: yaml
459
+ .. configuration-block ::
460
+
461
+ .. code-block :: yaml
462
+
463
+ # config/packages/security.yaml
464
+ security :
465
+ providers :
466
+ # the name of your user provider can be anything
467
+ your_custom_user_provider :
468
+ id : App\Security\UserProvider
469
+
470
+ .. code-block :: xml
471
+
472
+ <!-- config/packages/security.xml -->
473
+ <?xml version =" 1.0" encoding =" UTF-8" ?>
474
+ <srv : container xmlns =" http://symfony.com/schema/dic/security"
475
+ xmlns : xsi =" http://www.w3.org/2001/XMLSchema-instance"
476
+ xmlns : srv =" http://symfony.com/schema/dic/services"
477
+ xsi : schemaLocation =" http://symfony.com/schema/dic/services
478
+ https://symfony.com/schema/dic/services/services-1.0.xsd
479
+ http://symfony.com/schema/dic/security
480
+ https://symfony.com/schema/dic/security/security-1.0.xsd" >
481
+
482
+ <config >
483
+ <!-- ... -->
484
+
485
+ <provider name =" your_custom_user_provider" id =" App\Security\UserProvider" >
486
+ <!-- ... -->
487
+ </provider >
488
+ </config >
489
+ </srv : container >
490
+
491
+ .. code-block :: php
492
+
493
+ // config/packages/security.php
494
+ use App\Security\UserProvider;
495
+ use Symfony\Config\SecurityConfig;
496
+
497
+ return static function (SecurityConfig $security): void {
498
+ // ...
350
499
351
- # config/packages/security.yaml
352
- security :
353
- providers :
354
- # the name of your user provider can be anything
355
- your_custom_user_provider :
356
- id : App\Security\UserProvider
500
+ $customProvider = $security->provider('your_custom_user_provider')
501
+ ->id(UserProvider::class)
502
+ // ...
503
+ ;
504
+ };
357
505
358
506
Lastly, update the ``config/packages/security.yaml `` file to set the
359
507
``provider `` key to ``your_custom_user_provider `` in all the firewalls which
0 commit comments