@@ -1768,7 +1768,7 @@ To enable logging out, activate the ``logout`` config parameter under your fire
1768
1768
main :
1769
1769
# ...
1770
1770
logout :
1771
- path : app_logout
1771
+ path : /logout
1772
1772
1773
1773
# where to redirect after logout
1774
1774
# target: app_any_route
@@ -1789,11 +1789,10 @@ To enable logging out, activate the ``logout`` config parameter under your fire
1789
1789
<!-- ... -->
1790
1790
1791
1791
<firewall name =" main" >
1792
- <!-- ... -->
1793
- <logout path =" app_logout" />
1792
+ <logout path =" /logout" />
1794
1793
1795
1794
<!-- use "target" to configure where to redirect after logout
1796
- <logout path="app_logout " target="app_any_route"/>
1795
+ <logout path="/logout " target="app_any_route"/>
1797
1796
-->
1798
1797
</firewall >
1799
1798
</config >
@@ -1810,69 +1809,54 @@ To enable logging out, activate the ``logout`` config parameter under your fire
1810
1809
$mainFirewall = $security->firewall('main');
1811
1810
// ...
1812
1811
$mainFirewall->logout()
1813
- // the argument can be either a route name or a path
1814
- ->path('app_logout')
1812
+ ->path('/logout')
1815
1813
1816
1814
// where to redirect after logout
1817
1815
// ->target('app_any_route')
1818
1816
;
1819
1817
};
1820
1818
1821
- 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 ``.
1822
1821
1823
- .. configuration-block ::
1824
-
1825
- .. code-block :: php-attributes
1822
+ .. tip ::
1826
1823
1827
- // src/Controller/SecurityController.php
1828
- 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 ``).
1829
1826
1830
- use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
1831
- 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:
1832
1829
1833
- class SecurityController extends AbstractController
1834
- {
1835
- #[Route('/logout', name: 'app_logout', methods: ['GET'])]
1836
- public function logout(): never
1837
- {
1838
- // controller can be blank: it will never be called!
1839
- throw new \Exception('Don\'t forget to activate logout in security.yaml');
1840
- }
1841
- }
1830
+ .. configuration-block ::
1842
1831
1843
1832
.. code-block :: yaml
1844
1833
1845
- # config/routes.yaml
1846
- app_logout :
1847
- path : / logout
1848
- methods : GET
1834
+ # config/routes/security .yaml
1835
+ _symfony_logout :
1836
+ resource : security.route_loader. logout
1837
+ type : service
1849
1838
1850
1839
.. code-block :: xml
1851
1840
1852
- <!-- config/routes.xml -->
1841
+ <!-- config/routes/security .xml -->
1853
1842
<?xml version =" 1.0" encoding =" UTF-8" ?>
1854
1843
<routes xmlns =" http://symfony.com/schema/routing"
1855
1844
xmlns : xsi =" http://www.w3.org/2001/XMLSchema-instance"
1856
1845
xsi : schemaLocation =" http://symfony.com/schema/routing
1857
1846
https://symfony.com/schema/routing/routing-1.0.xsd" >
1858
1847
1859
- <route id = " app_logout " path = " / logout" methods = " GET " />
1848
+ <import resource = " security.route_loader. logout" type = " service " />
1860
1849
</routes >
1861
1850
1862
1851
.. code-block :: php
1863
1852
1864
- // config/routes.php
1853
+ // config/routes/security .php
1865
1854
use Symfony\Component\Routing\Loader\Configurator\RoutingConfigurator;
1866
1855
1867
- return function (RoutingConfigurator $routes): void {
1868
- $routes->add('app_logout', '/logout')
1869
- ->methods(['GET'])
1870
- ;
1856
+ return static function (RoutingConfigurator $routes): void {
1857
+ $routes->import('security.route_loader.logout', 'service');
1871
1858
};
1872
1859
1873
- That's it! By sending a user to the ``app_logout `` route (i.e. to ``/logout ``)
1874
- Symfony will un-authenticate the current user and redirect them.
1875
-
1876
1860
Logout programmatically
1877
1861
~~~~~~~~~~~~~~~~~~~~~~~
1878
1862
@@ -1950,6 +1934,105 @@ to execute custom logic::
1950
1934
}
1951
1935
}
1952
1936
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
+
1953
2036
.. _retrieving-the-user-object :
1954
2037
1955
2038
Fetching the User Object
0 commit comments