Skip to content

Commit ecc28e1

Browse files
committed
Rewrite Security documentation
1 parent 01cda97 commit ecc28e1

16 files changed

+2611
-3046
lines changed

_build/conf.py

Lines changed: 1 addition & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -119,19 +119,9 @@
119119
lexers['varnish3'] = CLexer()
120120
lexers['varnish4'] = CLexer()
121121
lexers['terminal'] = TerminalLexer()
122+
lexers['terminal-maker'] = TerminalLexer()
122123
lexers['env'] = BashLexer()
123124

124-
config_block = {
125-
'apache': 'Apache',
126-
'markdown': 'Markdown',
127-
'nginx': 'Nginx',
128-
'rst': 'reStructuredText',
129-
'varnish2': 'Varnish 2',
130-
'varnish3': 'Varnish 3',
131-
'varnish4': 'Varnish 4',
132-
'env': '.env'
133-
}
134-
135125
# don't enable Sphinx Domains
136126
primary_domain = None
137127

_build/redirection_map

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -514,5 +514,5 @@
514514
/service_container/3.3-di-changes https://symfony.com/doc/3.4/service_container/3.3-di-changes.html
515515
/frontend/encore/shared-entry /frontend/encore/split-chunks
516516
/testing/functional_tests_assertions /testing#testing-application-assertions
517-
/security/named_encoders /security/named_hashers
518517
/security/experimental_authenticators /security/authenticator_manager
518+
/security/user_provider /security#security-user-providers

_images/security/anonymous_wdt.png

2.92 KB
Loading

reference/configuration/security.rst

Lines changed: 0 additions & 267 deletions
Original file line numberDiff line numberDiff line change
@@ -120,273 +120,6 @@ and to allow anonymous users to the login form page.
120120

121121
This option is explained in detail in :doc:`/security/access_control`.
122122

123-
.. _encoders:
124-
125-
hashers
126-
-------
127-
128-
This option defines the algorithm used to *hash* the password of the users
129-
(which in previous Symfony versions was wrongly called *"password encoding"*).
130-
131-
If your app defines more than one user class, each of them can define its own
132-
hashing algorithm. Also, each algorithm defines different config options:
133-
134-
.. configuration-block::
135-
136-
.. code-block:: yaml
137-
138-
# config/packages/security.yaml
139-
security:
140-
# ...
141-
142-
password_hashers:
143-
# auto hasher with default options
144-
App\Entity\User: 'auto'
145-
146-
# auto hasher with custom options
147-
App\Entity\User:
148-
algorithm: 'auto'
149-
cost: 15
150-
151-
# Sodium hasher with default options
152-
App\Entity\User: 'sodium'
153-
154-
# Sodium hasher with custom options
155-
App\Entity\User:
156-
algorithm: 'sodium'
157-
memory_cost: 16384 # Amount in KiB. (16384 = 16 MiB)
158-
time_cost: 2 # Number of iterations
159-
160-
# MessageDigestPasswordHasher hasher using SHA512 hashing with default options
161-
App\Entity\User: 'sha512'
162-
163-
.. code-block:: xml
164-
165-
<!-- config/packages/security.xml -->
166-
<?xml version="1.0" encoding="UTF-8" ?>
167-
<srv:container xmlns="http://symfony.com/schema/dic/security"
168-
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
169-
xmlns:srv="http://symfony.com/schema/dic/services"
170-
xsi:schemaLocation="http://symfony.com/schema/dic/services
171-
https://symfony.com/schema/dic/services/services-1.0.xsd
172-
http://symfony.com/schema/dic/security
173-
https://symfony.com/schema/dic/security/security-1.0.xsd">
174-
175-
<config>
176-
<!-- ... -->
177-
<!-- auto hasher with default options -->
178-
<security:password-hasher
179-
class="App\Entity\User"
180-
algorithm="auto"
181-
/>
182-
183-
<!-- auto hasher with custom options -->
184-
<security:password-hasher
185-
class="App\Entity\User"
186-
algorithm="auto"
187-
cost="15"
188-
/>
189-
190-
<!-- Sodium hasher with default options -->
191-
<security:password-hasher
192-
class="App\Entity\User"
193-
algorithm="sodium"
194-
/>
195-
196-
<!-- Sodium hasher with custom options -->
197-
<!-- memory_cost: amount in KiB. (16384 = 16 MiB)
198-
time_cost: number of iterations -->
199-
<security:password-hasher
200-
class="App\Entity\User"
201-
algorithm="sodium"
202-
memory_cost="16384"
203-
time_cost="2"
204-
/>
205-
206-
<!-- MessageDigestPasswordHasher hasher using SHA512 hashing with default options -->
207-
<security:password-hasher
208-
class="App\Entity\User"
209-
algorithm="sha512"
210-
/>
211-
</config>
212-
</srv:container>
213-
214-
.. code-block:: php
215-
216-
// config/packages/security.php
217-
use App\Entity\User;
218-
use Symfony\Config\SecurityConfig;
219-
220-
return static function (SecurityConfig $security) {
221-
// ...
222-
223-
// auto hasher with default options
224-
$security->passwordHasher(User::class)
225-
->algorithm('auto');
226-
227-
// auto hasher with custom options
228-
$security->passwordHasher(User::class)
229-
->algorithm('auto')
230-
->cost(15);
231-
232-
// Sodium hasher with default options
233-
$security->passwordHasher(User::class)
234-
->algorithm('sodium');
235-
236-
// Sodium hasher with custom options
237-
$security->passwordHasher(User::class)
238-
->algorithm('sodium')
239-
->memoryCost(16384) // Amount in KiB. (16384 = 16 MiB)
240-
->timeCost(2); // Number of iterations
241-
242-
// MessageDigestPasswordHasher hasher using SHA512 hashing with default options
243-
$security->passwordHasher(User::class)
244-
->algorithm('sha512');
245-
};
246-
247-
.. versionadded:: 5.3
248-
249-
The ``password_hashers`` option was introduced in Symfony 5.3. In previous
250-
versions it was called ``encoders``.
251-
252-
.. tip::
253-
254-
You can also create your own password hashers as services and you can even
255-
select a different password hasher for each user instance. Read
256-
:doc:`this article </security/named_hashers>` for more details.
257-
258-
.. tip::
259-
260-
Hashing passwords is resource intensive and takes time in order to generate
261-
secure password hashes. In tests however, secure hashes are not important, so
262-
you can change the password hasher configuration in ``test`` environment to
263-
run tests faster:
264-
265-
.. configuration-block::
266-
267-
.. code-block:: yaml
268-
269-
# config/packages/test/security.yaml
270-
password_hashers:
271-
# Use your user class name here
272-
App\Entity\User:
273-
algorithm: auto # This should be the same value as in config/packages/security.yaml
274-
cost: 4 # Lowest possible value for bcrypt
275-
time_cost: 3 # Lowest possible value for argon
276-
memory_cost: 10 # Lowest possible value for argon
277-
278-
.. code-block:: xml
279-
280-
<!-- config/packages/test/security.xml -->
281-
<?xml version="1.0" encoding="UTF-8"?>
282-
<srv:container xmlns="http://symfony.com/schema/dic/security"
283-
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
284-
xmlns:srv="http://symfony.com/schema/dic/services"
285-
xsi:schemaLocation="http://symfony.com/schema/dic/services
286-
https://symfony.com/schema/dic/services/services-1.0.xsd">
287-
288-
<config>
289-
<!-- class: Use your user class name here -->
290-
<!-- algorithm: This should be the same value as in config/packages/security.yaml -->
291-
<!-- cost: Lowest possible value for bcrypt -->
292-
<!-- time_cost: Lowest possible value for argon -->
293-
<!-- memory_cost: Lowest possible value for argon -->
294-
<security:password-hasher
295-
class="App\Entity\User"
296-
algorithm="auto"
297-
cost="4"
298-
time_cost="3"
299-
memory_cost="10"
300-
/>
301-
</config>
302-
</srv:container>
303-
304-
.. code-block:: php
305-
306-
// config/packages/test/security.php
307-
use App\Entity\User;
308-
use Symfony\Config\SecurityConfig;
309-
310-
return static function (SecurityConfig $security) {
311-
// ...
312-
313-
// Use your user class name here
314-
$security->passwordHasher(User::class)
315-
->algorithm('auto') // This should be the same value as in config/packages/security.yaml
316-
->cost(4) // Lowest possible value for bcrypt
317-
->timeCost(2) // Lowest possible value for argon
318-
->memoryCost(10) // Lowest possible value for argon
319-
;
320-
};
321-
322-
323-
.. _reference-security-encoder-auto:
324-
.. _using-the-auto-password-encoder:
325-
326-
Using the "auto" Password Hasher
327-
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
328-
329-
It automatically selects the best available hasher. Starting from Symfony 5.3,
330-
it uses the Bcrypt hasher. If PHP or Symfony adds new password hashers in the
331-
future, it might select a different hasher.
332-
333-
Because of this, the length of the hashed passwords may change in the future, so
334-
make sure to allocate enough space for them to be persisted (``varchar(255)``
335-
should be a good setting).
336-
337-
.. _reference-security-encoder-bcrypt:
338-
339-
Using the Bcrypt Password Hasher
340-
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
341-
342-
It produces hashed passwords with the `bcrypt password hashing function`_.
343-
Hashed passwords are ``60`` characters long, so make sure to
344-
allocate enough space for them to be persisted. Also, passwords include the
345-
`cryptographic salt`_ inside them (it's generated automatically for each new
346-
password) so you don't have to deal with it.
347-
348-
Its only configuration option is ``cost``, which is an integer in the range of
349-
``4-31`` (by default, ``13``). Each single increment of the cost **doubles the
350-
time** it takes to hash a password. It's designed this way so the password
351-
strength can be adapted to the future improvements in computation power.
352-
353-
You can change the cost at any time — even if you already have some passwords
354-
hashed using a different cost. New passwords will be hashed using the new
355-
cost, while the already hashed ones will be validated using a cost that was
356-
used back when they were hashed.
357-
358-
.. tip::
359-
360-
A simple technique to make tests much faster when using BCrypt is to set
361-
the cost to ``4``, which is the minimum value allowed, in the ``test``
362-
environment configuration.
363-
364-
.. _reference-security-sodium:
365-
.. _using-the-argon2i-password-encoder:
366-
.. _using-the-sodium-password-encoder:
367-
368-
Using the Sodium Password Hasher
369-
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
370-
371-
It uses the `Argon2 key derivation function`_. Argon2 support was introduced
372-
in PHP 7.2 by bundeling the `libsodium`_ extension.
373-
374-
The hashed passwords are ``96`` characters long, but due to the hashing
375-
requirements saved in the resulting hash this may change in the future, so make
376-
sure to allocate enough space for them to be persisted. Also, passwords include
377-
the `cryptographic salt`_ inside them (it's generated automatically for each new
378-
password) so you don't have to deal with it.
379-
380-
.. _reference-security-pbkdf2:
381-
.. _using-the-pbkdf2-encoder:
382-
383-
Using the PBKDF2 Hasher
384-
~~~~~~~~~~~~~~~~~~~~~~~
385-
386-
Using the `PBKDF2`_ hasher is no longer recommended since PHP added support for
387-
Sodium and BCrypt. Legacy application still using it are encouraged to upgrade
388-
to those newer hashing algorithms.
389-
390123
firewalls
391124
---------
392125

0 commit comments

Comments
 (0)