@@ -1587,6 +1587,7 @@ and set the ``limiter`` option to its service ID:
1587
1587
$globalFactory : ' @limiter.ip_login'
1588
1588
# localFactory is the limiter for username+IP
1589
1589
$localFactory : ' @limiter.username_ip_login'
1590
+ $secret : ' %kernel.secret%'
1590
1591
1591
1592
security :
1592
1593
firewalls :
@@ -1637,6 +1638,8 @@ and set the ``limiter`` option to its service ID:
1637
1638
<srv : argument type =" service" id =" limiter.ip_login" />
1638
1639
<!-- 2nd argument is the limiter for username+IP -->
1639
1640
<srv : argument type =" service" id =" limiter.username_ip_login" />
1641
+ <!-- 3rd argument is the app secret -->
1642
+ <srv : argument type =" service" id =" %kernel.secret%" />
1640
1643
</srv : service >
1641
1644
</srv : services >
1642
1645
@@ -1679,6 +1682,8 @@ and set the ``limiter`` option to its service ID:
1679
1682
new Reference('limiter.ip_login'),
1680
1683
// 2nd argument is the limiter for username+IP
1681
1684
new Reference('limiter.username_ip_login'),
1685
+ // 3rd argument is the app secret
1686
+ new Reference('kernel.secret'),
1682
1687
]);
1683
1688
1684
1689
$security->firewall('main')
@@ -1763,7 +1768,7 @@ To enable logging out, activate the ``logout`` config parameter under your fire
1763
1768
main :
1764
1769
# ...
1765
1770
logout :
1766
- path : app_logout
1771
+ path : /logout
1767
1772
1768
1773
# where to redirect after logout
1769
1774
# target: app_any_route
@@ -1784,11 +1789,10 @@ To enable logging out, activate the ``logout`` config parameter under your fire
1784
1789
<!-- ... -->
1785
1790
1786
1791
<firewall name =" main" >
1787
- <!-- ... -->
1788
- <logout path =" app_logout" />
1792
+ <logout path =" /logout" />
1789
1793
1790
1794
<!-- 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"/>
1792
1796
-->
1793
1797
</firewall >
1794
1798
</config >
@@ -1805,69 +1809,54 @@ To enable logging out, activate the ``logout`` config parameter under your fire
1805
1809
$mainFirewall = $security->firewall('main');
1806
1810
// ...
1807
1811
$mainFirewall->logout()
1808
- // the argument can be either a route name or a path
1809
- ->path('app_logout')
1812
+ ->path('/logout')
1810
1813
1811
1814
// where to redirect after logout
1812
1815
// ->target('app_any_route')
1813
1816
;
1814
1817
};
1815
1818
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 ``.
1817
1821
1818
- .. configuration-block ::
1819
-
1820
- .. code-block :: php-attributes
1822
+ .. tip ::
1821
1823
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 ``).
1824
1826
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:
1827
1829
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 ::
1837
1831
1838
1832
.. code-block :: yaml
1839
1833
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
1844
1838
1845
1839
.. code-block :: xml
1846
1840
1847
- <!-- config/routes.xml -->
1841
+ <!-- config/routes/security .xml -->
1848
1842
<?xml version =" 1.0" encoding =" UTF-8" ?>
1849
1843
<routes xmlns =" http://symfony.com/schema/routing"
1850
1844
xmlns : xsi =" http://www.w3.org/2001/XMLSchema-instance"
1851
1845
xsi : schemaLocation =" http://symfony.com/schema/routing
1852
1846
https://symfony.com/schema/routing/routing-1.0.xsd" >
1853
1847
1854
- <route id = " app_logout " path = " / logout" methods = " GET " />
1848
+ <import resource = " security.route_loader. logout" type = " service " />
1855
1849
</routes >
1856
1850
1857
1851
.. code-block :: php
1858
1852
1859
- // config/routes.php
1853
+ // config/routes/security .php
1860
1854
use Symfony\Component\Routing\Loader\Configurator\RoutingConfigurator;
1861
1855
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');
1866
1858
};
1867
1859
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
-
1871
1860
Logout programmatically
1872
1861
~~~~~~~~~~~~~~~~~~~~~~~
1873
1862
@@ -1945,6 +1934,105 @@ to execute custom logic::
1945
1934
}
1946
1935
}
1947
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
+
1948
2036
.. _retrieving-the-user-object :
1949
2037
1950
2038
Fetching the User Object
0 commit comments