@@ -1587,6 +1587,7 @@ and set the ``limiter`` option to its service ID:
15871587 $globalFactory : ' @limiter.ip_login'
15881588 # localFactory is the limiter for username+IP
15891589 $localFactory : ' @limiter.username_ip_login'
1590+ $secret : ' %kernel.secret%'
15901591
15911592 security :
15921593 firewalls :
@@ -1637,6 +1638,8 @@ and set the ``limiter`` option to its service ID:
16371638 <srv : argument type =" service" id =" limiter.ip_login" />
16381639 <!-- 2nd argument is the limiter for username+IP -->
16391640 <srv : argument type =" service" id =" limiter.username_ip_login" />
1641+ <!-- 3rd argument is the app secret -->
1642+ <srv : argument type =" service" id =" %kernel.secret%" />
16401643 </srv : service >
16411644 </srv : services >
16421645
@@ -1679,6 +1682,8 @@ and set the ``limiter`` option to its service ID:
16791682 new Reference('limiter.ip_login'),
16801683 // 2nd argument is the limiter for username+IP
16811684 new Reference('limiter.username_ip_login'),
1685+ // 3rd argument is the app secret
1686+ new Reference('kernel.secret'),
16821687 ]);
16831688
16841689 $security->firewall('main')
@@ -1763,7 +1768,7 @@ To enable logging out, activate the ``logout`` config parameter under your fire
17631768 main :
17641769 # ...
17651770 logout :
1766- path : app_logout
1771+ path : /logout
17671772
17681773 # where to redirect after logout
17691774 # target: app_any_route
@@ -1784,11 +1789,10 @@ To enable logging out, activate the ``logout`` config parameter under your fire
17841789 <!-- ... -->
17851790
17861791 <firewall name =" main" >
1787- <!-- ... -->
1788- <logout path =" app_logout" />
1792+ <logout path =" /logout" />
17891793
17901794 <!-- use "target" to configure where to redirect after logout
1791- <logout path="app_logout " target="app_any_route"/>
1795+ <logout path="/logout " target="app_any_route"/>
17921796 -->
17931797 </firewall >
17941798 </config >
@@ -1805,69 +1809,54 @@ To enable logging out, activate the ``logout`` config parameter under your fire
18051809 $mainFirewall = $security->firewall('main');
18061810 // ...
18071811 $mainFirewall->logout()
1808- // the argument can be either a route name or a path
1809- ->path('app_logout')
1812+ ->path('/logout')
18101813
18111814 // where to redirect after logout
18121815 // ->target('app_any_route')
18131816 ;
18141817 };
18151818
1816- Next, you need to create a route for this URL (but not a controller):
1819+ Symfony will then un-authenticate users navigating to the configured ``path ``,
1820+ and redirect them to the configured ``target ``.
18171821
1818- .. configuration-block ::
1819-
1820- .. code-block :: php-attributes
1822+ .. tip ::
18211823
1822- // src/Controller/SecurityController.php
1823- namespace App\Controller;
1824+ If you need to reference the logout path, you can use the `` _logout_<firewallname> ``
1825+ route name (e.g. `` _logout_main ``).
18241826
1825- use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
1826- use Symfony\Component\Routing\Annotation\Route;
1827+ If your project does not use :ref: ` Symfony Flex < symfony-flex >`, make sure
1828+ you have imported the logout route loader in your routes:
18271829
1828- class SecurityController extends AbstractController
1829- {
1830- #[Route('/logout', name: 'app_logout', methods: ['GET'])]
1831- public function logout(): never
1832- {
1833- // controller can be blank: it will never be called!
1834- throw new \Exception('Don\'t forget to activate logout in security.yaml');
1835- }
1836- }
1830+ .. configuration-block ::
18371831
18381832 .. code-block :: yaml
18391833
1840- # config/routes.yaml
1841- app_logout :
1842- path : / logout
1843- methods : GET
1834+ # config/routes/security .yaml
1835+ _symfony_logout :
1836+ resource : security.route_loader. logout
1837+ type : service
18441838
18451839 .. code-block :: xml
18461840
1847- <!-- config/routes.xml -->
1841+ <!-- config/routes/security .xml -->
18481842 <?xml version =" 1.0" encoding =" UTF-8" ?>
18491843 <routes xmlns =" http://symfony.com/schema/routing"
18501844 xmlns : xsi =" http://www.w3.org/2001/XMLSchema-instance"
18511845 xsi : schemaLocation =" http://symfony.com/schema/routing
18521846 https://symfony.com/schema/routing/routing-1.0.xsd" >
18531847
1854- <route id = " app_logout " path = " / logout" methods = " GET " />
1848+ <import resource = " security.route_loader. logout" type = " service " />
18551849 </routes >
18561850
18571851 .. code-block :: php
18581852
1859- // config/routes.php
1853+ // config/routes/security .php
18601854 use Symfony\Component\Routing\Loader\Configurator\RoutingConfigurator;
18611855
1862- return function (RoutingConfigurator $routes): void {
1863- $routes->add('app_logout', '/logout')
1864- ->methods(['GET'])
1865- ;
1856+ return static function (RoutingConfigurator $routes): void {
1857+ $routes->import('security.route_loader.logout', 'service');
18661858 };
18671859
1868- That's it! By sending a user to the ``app_logout `` route (i.e. to ``/logout ``)
1869- Symfony will un-authenticate the current user and redirect them.
1870-
18711860 Logout programmatically
18721861~~~~~~~~~~~~~~~~~~~~~~~
18731862
@@ -1945,6 +1934,105 @@ to execute custom logic::
19451934 }
19461935 }
19471936
1937+ Customizing Logout Path
1938+ ~~~~~~~~~~~~~~~~~~~~~~~
1939+
1940+ Another option is to configure ``path `` as a route name. This can be useful
1941+ if you want logout URIs to be dynamic (e.g. translated according to the
1942+ current locale). In that case, you have to create this route yourself:
1943+
1944+ .. configuration-block ::
1945+
1946+ .. code-block :: yaml
1947+
1948+ # config/routes.yaml
1949+ app_logout :
1950+ path :
1951+ en : /logout
1952+ fr : /deconnexion
1953+ methods : GET
1954+
1955+ .. code-block :: xml
1956+
1957+ <!-- config/routes.xml -->
1958+ <?xml version =" 1.0" encoding =" UTF-8" ?>
1959+ <routes xmlns =" http://symfony.com/schema/routing"
1960+ xmlns : xsi =" http://www.w3.org/2001/XMLSchema-instance"
1961+ xsi : schemaLocation =" http://symfony.com/schema/routing
1962+ https://symfony.com/schema/routing/routing-1.0.xsd" >
1963+
1964+ <route id =" app_logout" path =" /logout" methods =" GET" >
1965+ <path locale =" en" >/logout</path >
1966+ <path locale =" fr" >/deconnexion</path >
1967+ </route >
1968+ </routes >
1969+
1970+ .. code-block :: php
1971+
1972+ // config/routes.php
1973+ use Symfony\Component\Routing\Loader\Configurator\RoutingConfigurator;
1974+
1975+ return function (RoutingConfigurator $routes): void {
1976+ $routes->add('app_logout', [
1977+ 'en' => '/logout',
1978+ 'fr' => '/deconnexion',
1979+ ])
1980+ ->methods(['GET'])
1981+ ;
1982+ };
1983+
1984+ Then, pass the route name to the ``path `` option:
1985+
1986+ .. configuration-block ::
1987+
1988+ .. code-block :: yaml
1989+
1990+ # config/packages/security.yaml
1991+ security :
1992+ # ...
1993+
1994+ firewalls :
1995+ main :
1996+ # ...
1997+ logout :
1998+ path : app_logout
1999+
2000+ .. code-block :: xml
2001+
2002+ <!-- config/packages/security.xml -->
2003+ <?xml version =" 1.0" encoding =" UTF-8" ?>
2004+ <srv : container xmlns =" http://symfony.com/schema/dic/security"
2005+ xmlns : xsi =" http://www.w3.org/2001/XMLSchema-instance"
2006+ xmlns : srv =" http://symfony.com/schema/dic/services"
2007+ xsi : schemaLocation =" http://symfony.com/schema/dic/services
2008+ https://symfony.com/schema/dic/services/services-1.0.xsd
2009+ http://symfony.com/schema/dic/security
2010+ https://symfony.com/schema/dic/security/security-1.0.xsd" >
2011+
2012+ <config >
2013+ <!-- ... -->
2014+
2015+ <firewall name =" main" >
2016+ <logout path =" app_logout" />
2017+ </firewall >
2018+ </config >
2019+ </srv : container >
2020+
2021+ .. code-block :: php
2022+
2023+ // config/packages/security.php
2024+ use Symfony\Config\SecurityConfig;
2025+
2026+ return static function (SecurityConfig $security): void {
2027+ // ...
2028+
2029+ $mainFirewall = $security->firewall('main');
2030+ // ...
2031+ $mainFirewall->logout()
2032+ ->path('app_logout')
2033+ ;
2034+ };
2035+
19482036 .. _retrieving-the-user-object :
19492037
19502038Fetching the User Object
0 commit comments