Skip to content

Commit 11e8f56

Browse files
committed
[HttpFoundation] Add documentation for #[IsSignatureValid] attribute with usage examples and options
1 parent 00862ab commit 11e8f56

File tree

1 file changed

+98
-0
lines changed

1 file changed

+98
-0
lines changed

routing.rst

Lines changed: 98 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3031,6 +3031,104 @@ If you need to know the reason why a signed URI is invalid, you can use the
30313031
Support for :doc:`Symfony Clock </components/clock>` in ``UriSigner`` was
30323032
introduced in Symfony 7.3.
30333033

3034+
Another way to validate incoming requests is to use the ``#[IsSignatureValid]`` attribute.
3035+
3036+
In the following example, all incoming requests to this controller action will be verified for
3037+
a valid signature. If the signature is missing or invalid,
3038+
a **404 Not Found** response will be returned by default:
3039+
3040+
.. code-block:: php-attributes
3041+
3042+
// src/Controller/SomeController.php
3043+
// ...
3044+
3045+
use App\Security\Attribute\IsSignatureValid;
3046+
3047+
#[IsSignatureValid]
3048+
public function someAction(): Response
3049+
{
3050+
// ...
3051+
}
3052+
3053+
3054+
You can customize the failure behavior by changing the HTTP status code returned
3055+
when validation fails, using the ``validationFailedStatusCode`` argument::
3056+
3057+
3058+
// src/Controller/SomeController.php
3059+
// ...
3060+
3061+
use App\Security\Attribute\IsSignatureValid;
3062+
3063+
#[IsSignatureValid(validationFailedStatusCode: 401)]
3064+
public function someAction(): Response
3065+
{
3066+
// ...
3067+
}
3068+
3069+
To restrict signature validation to specific HTTP methods,
3070+
use the ``methods`` argument. This can be a string or an array of methods::
3071+
3072+
// Only validate POST requests
3073+
#[IsSignatureValid(methods: 'POST')]
3074+
public function createItem(): Response
3075+
{
3076+
// ...
3077+
}
3078+
3079+
// Validate both POST and PUT requests
3080+
#[IsSignatureValid(methods: ['POST', 'PUT'])]
3081+
public function updateItem(): Response
3082+
{
3083+
// ...
3084+
}
3085+
3086+
If you prefer to throw an exception instead of returning a response,
3087+
pass ``throw: true``. This is useful when you want to handle the failure globally
3088+
(e.g., via an exception listener)::
3089+
3090+
// src/Controller/SomeController.php
3091+
// ...
3092+
3093+
use App\Security\Attribute\IsSignatureValid;
3094+
3095+
#[IsSignatureValid(throw: true)]
3096+
public function someAction(): Response
3097+
{
3098+
// ...
3099+
}
3100+
3101+
You can also apply ``#[IsSignatureValid]`` at the controller class level.
3102+
This way, all actions within the controller will automatically
3103+
be protected by signature validation::
3104+
3105+
// src/Controller/SecureController.php
3106+
// ...
3107+
3108+
use App\Security\Attribute\IsSignatureValid;
3109+
3110+
#[IsSignatureValid]
3111+
class SecureController extends AbstractController
3112+
{
3113+
public function index(): Response
3114+
{
3115+
// ...
3116+
}
3117+
3118+
public function submit(): Response
3119+
{
3120+
// ...
3121+
}
3122+
}
3123+
3124+
3125+
This attribute provides a declarative way to enforce request signature validation directly
3126+
at the controller level, helping to keep your security logic consistent and maintainable.
3127+
3128+
.. versionadded:: 7.4
3129+
3130+
The ``#[IsSignatureValid]`` attribute was introduced in Symfony 7.4.
3131+
30343132
Troubleshooting
30353133
---------------
30363134

0 commit comments

Comments
 (0)