logout.adoc 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147
  1. [[jc-logout]]
  2. = Handling Logouts
  3. [[logout-java-configuration]]
  4. == Logout Java/Kotlin Configuration
  5. When using the `{security-api-url}org/springframework/security/config/annotation/web/configuration/WebSecurityConfigurerAdapter.html[WebSecurityConfigurerAdapter]`, logout capabilities are automatically applied.
  6. The default is that accessing the URL `/logout` will log the user out by:
  7. - Invalidating the HTTP Session
  8. - Cleaning up any RememberMe authentication that was configured
  9. - Clearing the `SecurityContextHolder`
  10. - Redirect to `/login?logout`
  11. Similar to configuring login capabilities, however, you also have various options to further customize your logout requirements:
  12. .Logout Configuration
  13. ====
  14. .Java
  15. [source,java,role="primary"]
  16. ----
  17. protected void configure(HttpSecurity http) throws Exception {
  18. http
  19. .logout(logout -> logout // <1>
  20. .logoutUrl("/my/logout") // <2>
  21. .logoutSuccessUrl("/my/index") // <3>
  22. .logoutSuccessHandler(logoutSuccessHandler) // <4>
  23. .invalidateHttpSession(true) // <5>
  24. .addLogoutHandler(logoutHandler) // <6>
  25. .deleteCookies(cookieNamesToClear) // <7>
  26. )
  27. ...
  28. }
  29. ----
  30. .Kotlin
  31. [source,kotlin,role="secondary"]
  32. -----
  33. override fun configure(http: HttpSecurity) {
  34. http {
  35. logout {
  36. logoutUrl = "/my/logout" // <1>
  37. logoutSuccessUrl = "/my/index" // <2>
  38. logoutSuccessHandler = customLogoutSuccessHandler // <3>
  39. invalidateHttpSession = true // <4>
  40. addLogoutHandler(logoutHandler) // <5>
  41. deleteCookies(cookieNamesToClear) // <6>
  42. }
  43. }
  44. }
  45. -----
  46. ====
  47. <1> Provides logout support.
  48. This is automatically applied when using `WebSecurityConfigurerAdapter`.
  49. <2> The URL that triggers log out to occur (default is `/logout`).
  50. If CSRF protection is enabled (default), then the request must also be a POST.
  51. For more information, please consult the {security-api-url}org/springframework/security/config/annotation/web/configurers/LogoutConfigurer.html#logoutUrl-java.lang.String-[Javadoc].
  52. <3> The URL to redirect to after logout has occurred.
  53. The default is `/login?logout`.
  54. For more information, please consult the {security-api-url}org/springframework/security/config/annotation/web/configurers/LogoutConfigurer.html#logoutSuccessUrl-java.lang.String-[Javadoc].
  55. <4> Let's you specify a custom `LogoutSuccessHandler`.
  56. If this is specified, `logoutSuccessUrl()` is ignored.
  57. For more information, please consult the {security-api-url}org/springframework/security/config/annotation/web/configurers/LogoutConfigurer.html#logoutSuccessHandler-org.springframework.security.web.authentication.logout.LogoutSuccessHandler-[Javadoc].
  58. <5> Specify whether to invalidate the `HttpSession` at the time of logout.
  59. This is *true* by default.
  60. Configures the `SecurityContextLogoutHandler` under the covers.
  61. For more information, please consult the {security-api-url}org/springframework/security/config/annotation/web/configurers/LogoutConfigurer.html#invalidateHttpSession-boolean-[Javadoc].
  62. <6> Adds a `LogoutHandler`.
  63. `SecurityContextLogoutHandler` is added as the last `LogoutHandler` by default.
  64. <7> Allows specifying the names of cookies to be removed on logout success.
  65. This is a shortcut for adding a `CookieClearingLogoutHandler` explicitly.
  66. [NOTE]
  67. ====
  68. Logouts can of course also be configured using the XML Namespace notation.
  69. Please see the documentation for the xref:servlet/appendix/namespace.adoc#nsa-logout[ logout element] in the Spring Security XML Namespace section for further details.
  70. ====
  71. Generally, in order to customize logout functionality, you can add
  72. `{security-api-url}org/springframework/security/web/authentication/logout/LogoutHandler.html[LogoutHandler]`
  73. and/or
  74. `{security-api-url}org/springframework/security/web/authentication/logout/LogoutSuccessHandler.html[LogoutSuccessHandler]`
  75. implementations.
  76. For many common scenarios, these handlers are applied under the
  77. covers when using the fluent API.
  78. [[ns-logout]]
  79. == Logout XML Configuration
  80. The `logout` element adds support for logging out by navigating to a particular URL.
  81. The default logout URL is `/logout`, but you can set it to something else using the `logout-url` attribute.
  82. More information on other available attributes may be found in the namespace appendix.
  83. [[jc-logout-handler]]
  84. == LogoutHandler
  85. Generally, `{security-api-url}org/springframework/security/web/authentication/logout/LogoutHandler.html[LogoutHandler]`
  86. implementations indicate classes that are able to participate in logout handling.
  87. They are expected to be invoked to perform necessary clean-up.
  88. As such they should
  89. not throw exceptions.
  90. Various implementations are provided:
  91. - {security-api-url}org/springframework/security/web/authentication/rememberme/PersistentTokenBasedRememberMeServices.html[PersistentTokenBasedRememberMeServices]
  92. - {security-api-url}org/springframework/security/web/authentication/rememberme/TokenBasedRememberMeServices.html[TokenBasedRememberMeServices]
  93. - {security-api-url}org/springframework/security/web/authentication/logout/CookieClearingLogoutHandler.html[CookieClearingLogoutHandler]
  94. - {security-api-url}org/springframework/security/web/csrf/CsrfLogoutHandler.html[CsrfLogoutHandler]
  95. - {security-api-url}org/springframework/security/web/authentication/logout/SecurityContextLogoutHandler.html[SecurityContextLogoutHandler]
  96. - {security-api-url}org/springframework/security/web/authentication/logout/HeaderWriterLogoutHandler.html[HeaderWriterLogoutHandler]
  97. Please see xref:servlet/authentication/rememberme.adoc#remember-me-impls[Remember-Me Interfaces and Implementations] for details.
  98. Instead of providing `LogoutHandler` implementations directly, the fluent API also provides shortcuts that provide the respective `LogoutHandler` implementations under the covers.
  99. E.g. `deleteCookies()` allows specifying the names of one or more cookies to be removed on logout success.
  100. This is a shortcut compared to adding a `CookieClearingLogoutHandler`.
  101. [[jc-logout-success-handler]]
  102. == LogoutSuccessHandler
  103. The `LogoutSuccessHandler` is called after a successful logout by the `LogoutFilter`, to handle e.g.
  104. redirection or forwarding to the appropriate destination.
  105. Note that the interface is almost the same as the `LogoutHandler` but may raise an exception.
  106. The following implementations are provided:
  107. - {security-api-url}org/springframework/security/web/authentication/logout/SimpleUrlLogoutSuccessHandler.html[SimpleUrlLogoutSuccessHandler]
  108. - HttpStatusReturningLogoutSuccessHandler
  109. As mentioned above, you don't need to specify the `SimpleUrlLogoutSuccessHandler` directly.
  110. Instead, the fluent API provides a shortcut by setting the `logoutSuccessUrl()`.
  111. This will setup the `SimpleUrlLogoutSuccessHandler` under the covers.
  112. The provided URL will be redirected to after a logout has occurred.
  113. The default is `/login?logout`.
  114. The `HttpStatusReturningLogoutSuccessHandler` can be interesting in REST API type scenarios.
  115. Instead of redirecting to a URL upon the successful logout, this `LogoutSuccessHandler` allows you to provide a plain HTTP status code to be returned.
  116. If not configured a status code 200 will be returned by default.
  117. [[jc-logout-references]]
  118. == Further Logout-Related References
  119. - <<ns-logout, Logout Handling>>
  120. - xref:servlet/test/mockmvc/logout.adoc#test-logout[ Testing Logout]
  121. - xref:servlet/integrations/servlet-api.adoc#servletapi-logout[ HttpServletRequest.logout()]
  122. - xref:servlet/authentication/rememberme.adoc#remember-me-impls[Remember-Me Interfaces and Implementations]
  123. - xref:servlet/exploits/csrf.adoc#servlet-considerations-csrf-logout[ Logging Out] in section CSRF Caveats
  124. - Documentation for the xref:servlet/appendix/namespace.adoc#nsa-logout[ logout element] in the Spring Security XML Namespace section