authentication.adoc 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171
  1. = Authentication Migrations
  2. The following steps relate to how to finish migrating authentication support.
  3. == Propagate ``AuthenticationServiceException``s
  4. {security-api-url}org/springframework/security/web/authentication/AuthenticationFilter.html[`AuthenticationFilter`] propagates {security-api-url}org/springframework/security/authentication/AuthenticationServiceException.html[``AuthenticationServiceException``]s to the {security-api-url}org/springframework/security/web/AuthenticationEntryPoint.html[`AuthenticationEntryPoint`].
  5. Because ``AuthenticationServiceException``s represent a server-side error instead of a client-side error, in 6.0, this changes to propagate them to the container.
  6. So, if you opted into this behavior by setting `rethrowAuthenticationServiceException` to `true`, you can now remove it like so:
  7. ====
  8. .Java
  9. [source,java,role="primary"]
  10. ----
  11. AuthenticationFilter authenticationFilter = new AuthenticationFilter(...);
  12. AuthenticationEntryPointFailureHandler handler = new AuthenticationEntryPointFailureHandler(...);
  13. handler.setRethrowAuthenticationServiceException(true);
  14. authenticationFilter.setAuthenticationFailureHandler(handler);
  15. ----
  16. .Kotlin
  17. [source,kotlin,role="secondary"]
  18. ----
  19. val authenticationFilter: AuthenticationFilter = new AuthenticationFilter(...)
  20. val handler: AuthenticationEntryPointFailureHandler = new AuthenticationEntryPointFailureHandler(...)
  21. handler.setRethrowAuthenticationServiceException(true)
  22. authenticationFilter.setAuthenticationFailureHandler(handler)
  23. ----
  24. .Xml
  25. [source,xml,role="secondary"]
  26. ----
  27. <bean id="authenticationFilter" class="org.springframework.security.web.authentication.AuthenticationFilter">
  28. <!-- ... -->
  29. <property ref="authenticationFailureHandler"/>
  30. </bean>
  31. <bean id="authenticationFailureHandler" class="org.springframework.security.web.authentication.AuthenticationEntryPointFailureHandler">
  32. <property name="rethrowAuthenticationServiceException" value="true"/>
  33. </bean>
  34. ----
  35. ====
  36. changes to:
  37. ====
  38. .Java
  39. [source,java,role="primary"]
  40. ----
  41. AuthenticationFilter authenticationFilter = new AuthenticationFilter(...);
  42. AuthenticationEntryPointFailureHandler handler = new AuthenticationEntryPointFailureHandler(...);
  43. authenticationFilter.setAuthenticationFailureHandler(handler);
  44. ----
  45. .Kotlin
  46. [source,kotlin,role="secondary"]
  47. ----
  48. val authenticationFilter: AuthenticationFilter = new AuthenticationFilter(...)
  49. val handler: AuthenticationEntryPointFailureHandler = new AuthenticationEntryPointFailureHandler(...)
  50. authenticationFilter.setAuthenticationFailureHandler(handler)
  51. ----
  52. .Xml
  53. [source,xml,role="secondary"]
  54. ----
  55. <bean id="authenticationFilter" class="org.springframework.security.web.authentication.AuthenticationFilter">
  56. <!-- ... -->
  57. <property ref="authenticationFailureHandler"/>
  58. </bean>
  59. <bean id="authenticationFailureHandler" class="org.springframework.security.web.authentication.AuthenticationEntryPointFailureHandler">
  60. <!-- ... -->
  61. </bean>
  62. ----
  63. ====
  64. [[servlet-opt-in-sha256-rememberme]]
  65. == Use SHA-256 in Remember Me
  66. In 6.0, the `TokenBasedRememberMeServices` uses SHA-256 to encode and match the token.
  67. To complete the migration, any default values can be removed.
  68. For example, if you opted in to the 6.0 default for `encodingAlgorithm` and `matchingAlgorithm` like so:
  69. ====
  70. .Java
  71. [source,java,role="primary"]
  72. ----
  73. @Configuration
  74. @EnableWebSecurity
  75. public class SecurityConfig {
  76. @Bean
  77. SecurityFilterChain securityFilterChain(HttpSecurity http, RememberMeServices rememberMeServices) throws Exception {
  78. http
  79. // ...
  80. .rememberMe((remember) -> remember
  81. .rememberMeServices(rememberMeServices)
  82. );
  83. return http.build();
  84. }
  85. @Bean
  86. RememberMeServices rememberMeServices(UserDetailsService userDetailsService) {
  87. RememberMeTokenAlgorithm encodingAlgorithm = RememberMeTokenAlgorithm.SHA256;
  88. TokenBasedRememberMeServices rememberMe = new TokenBasedRememberMeServices(myKey, userDetailsService, encodingAlgorithm);
  89. rememberMe.setMatchingAlgorithm(RememberMeTokenAlgorithm.SHA256);
  90. return rememberMe;
  91. }
  92. }
  93. ----
  94. .XML
  95. [source,xml,role="secondary"]
  96. ----
  97. <http>
  98. <remember-me services-ref="rememberMeServices"/>
  99. </http>
  100. <bean id="rememberMeServices" class=
  101. "org.springframework.security.web.authentication.rememberme.TokenBasedRememberMeServices">
  102. <property name="userDetailsService" ref="myUserDetailsService"/>
  103. <property name="key" value="springRocks"/>
  104. <property name="matchingAlgorithm" value="SHA256"/>
  105. <property name="encodingAlgorithm" value="SHA256"/>
  106. </bean>
  107. ----
  108. ====
  109. then the defaults can be removed:
  110. ====
  111. .Java
  112. [source,java,role="primary"]
  113. ----
  114. @Configuration
  115. @EnableWebSecurity
  116. public class SecurityConfig {
  117. @Bean
  118. SecurityFilterChain securityFilterChain(HttpSecurity http, RememberMeServices rememberMeServices) throws Exception {
  119. http
  120. // ...
  121. .rememberMe((remember) -> remember
  122. .rememberMeServices(rememberMeServices)
  123. );
  124. return http.build();
  125. }
  126. @Bean
  127. RememberMeServices rememberMeServices(UserDetailsService userDetailsService) {
  128. return new TokenBasedRememberMeServices(myKey, userDetailsService);
  129. }
  130. }
  131. ----
  132. .XML
  133. [source,xml,role="secondary"]
  134. ----
  135. <http>
  136. <remember-me services-ref="rememberMeServices"/>
  137. </http>
  138. <bean id="rememberMeServices" class=
  139. "org.springframework.security.web.authentication.rememberme.TokenBasedRememberMeServices">
  140. <property name="userDetailsService" ref="myUserDetailsService"/>
  141. <property name="key" value="springRocks"/>
  142. </bean>
  143. ----
  144. ====
  145. == Default authorities for oauth2Login()
  146. In Spring Security 5, the default `GrantedAuthority` given to a user that authenticates with an OAuth2 or OpenID Connect 1.0 provider (via `oauth2Login()`) is `ROLE_USER`.
  147. In Spring Security 6, the default authority given to a user authenticating with an OAuth2 provider is `OAUTH2_USER`.
  148. The default authority given to a user authenticating with an OpenID Connect 1.0 provider is `OIDC_USER`.
  149. If you configured the `GrantedAuthoritiesMapper` only for the purpose of updating to 6.0, you can remove it completely.