28
28
import org .springframework .security .authentication .AnonymousAuthenticationToken ;
29
29
import org .springframework .security .authentication .AuthenticationDetailsSource ;
30
30
import org .springframework .security .authentication .AuthenticationManager ;
31
- import org .springframework .security .authentication .UsernamePasswordAuthenticationToken ;
32
31
import org .springframework .security .core .Authentication ;
33
32
import org .springframework .security .core .AuthenticationException ;
34
33
import org .springframework .security .core .context .SecurityContext ;
35
34
import org .springframework .security .core .context .SecurityContextHolder ;
36
35
import org .springframework .security .core .context .SecurityContextHolderStrategy ;
37
36
import org .springframework .security .web .AuthenticationEntryPoint ;
37
+ import org .springframework .security .web .authentication .AuthenticationConverter ;
38
38
import org .springframework .security .web .authentication .NullRememberMeServices ;
39
39
import org .springframework .security .web .authentication .RememberMeServices ;
40
+ import org .springframework .security .web .authentication .WebAuthenticationDetailsSource ;
40
41
import org .springframework .security .web .context .RequestAttributeSecurityContextRepository ;
41
42
import org .springframework .security .web .context .SecurityContextRepository ;
42
43
import org .springframework .util .Assert ;
@@ -105,7 +106,7 @@ public class BasicAuthenticationFilter extends OncePerRequestFilter {
105
106
106
107
private String credentialsCharset = "UTF-8" ;
107
108
108
- private BasicAuthenticationConverter authenticationConverter = new BasicAuthenticationConverter ();
109
+ private AuthenticationConverter authenticationConverter = new BasicAuthenticationConverter ();
109
110
110
111
private SecurityContextRepository securityContextRepository = new RequestAttributeSecurityContextRepository ();
111
112
@@ -149,6 +150,18 @@ public void setSecurityContextRepository(SecurityContextRepository securityConte
149
150
this .securityContextRepository = securityContextRepository ;
150
151
}
151
152
153
+ /**
154
+ * Sets the
155
+ * {@link org.springframework.security.web.authentication.AuthenticationConverter} to
156
+ * use. Defaults to {@link BasicAuthenticationConverter}
157
+ * @param authenticationConverter the converter to use
158
+ * @since 6.2
159
+ */
160
+ public void setAuthenticationConverter (AuthenticationConverter authenticationConverter ) {
161
+ Assert .notNull (authenticationConverter , "authenticationConverter cannot be null" );
162
+ this .authenticationConverter = authenticationConverter ;
163
+ }
164
+
152
165
@ Override
153
166
public void afterPropertiesSet () {
154
167
Assert .notNull (this .authenticationManager , "An AuthenticationManager is required" );
@@ -161,7 +174,7 @@ public void afterPropertiesSet() {
161
174
protected void doFilterInternal (HttpServletRequest request , HttpServletResponse response , FilterChain chain )
162
175
throws IOException , ServletException {
163
176
try {
164
- UsernamePasswordAuthenticationToken authRequest = this .authenticationConverter .convert (request );
177
+ Authentication authRequest = this .authenticationConverter .convert (request );
165
178
if (authRequest == null ) {
166
179
this .logger .trace ("Did not process authentication request since failed to find "
167
180
+ "username and password in Basic Authorization header" );
@@ -250,20 +263,40 @@ public void setSecurityContextHolderStrategy(SecurityContextHolderStrategy secur
250
263
this .securityContextHolderStrategy = securityContextHolderStrategy ;
251
264
}
252
265
266
+ /**
267
+ * Sets the {@link AuthenticationDetailsSource} to use. By default, it is set to use
268
+ * the {@link WebAuthenticationDetailsSource}. Note that this configuration applies
269
+ * exclusively when the {@link #authenticationConverter} is set to
270
+ * {@link BasicAuthenticationConverter}. If you are utilizing a different
271
+ * implementation, you will need to manually specify the authentication details on it.
272
+ * @param authenticationDetailsSource the {@link AuthenticationDetailsSource} to use.
273
+ */
253
274
public void setAuthenticationDetailsSource (
254
275
AuthenticationDetailsSource <HttpServletRequest , ?> authenticationDetailsSource ) {
255
- this .authenticationConverter .setAuthenticationDetailsSource (authenticationDetailsSource );
276
+ if (this .authenticationConverter instanceof BasicAuthenticationConverter basicAuthenticationConverter ) {
277
+ basicAuthenticationConverter .setAuthenticationDetailsSource (authenticationDetailsSource );
278
+ }
256
279
}
257
280
258
281
public void setRememberMeServices (RememberMeServices rememberMeServices ) {
259
282
Assert .notNull (rememberMeServices , "rememberMeServices cannot be null" );
260
283
this .rememberMeServices = rememberMeServices ;
261
284
}
262
285
286
+ /**
287
+ * Sets the charset to use when decoding credentials to {@link String}s. By default,
288
+ * it is set to {@code UTF-8}. Note that this configuration applies exclusively when
289
+ * the {@link #authenticationConverter} is set to
290
+ * {@link BasicAuthenticationConverter}. If you are utilizing a different
291
+ * implementation, you will need to manually specify the charset on it.
292
+ * @param credentialsCharset the charset to use.
293
+ */
263
294
public void setCredentialsCharset (String credentialsCharset ) {
264
295
Assert .hasText (credentialsCharset , "credentialsCharset cannot be null or empty" );
265
296
this .credentialsCharset = credentialsCharset ;
266
- this .authenticationConverter .setCredentialsCharset (Charset .forName (credentialsCharset ));
297
+ if (this .authenticationConverter instanceof BasicAuthenticationConverter basicAuthenticationConverter ) {
298
+ basicAuthenticationConverter .setCredentialsCharset (Charset .forName (credentialsCharset ));
299
+ }
267
300
}
268
301
269
302
protected String getCredentialsCharset (HttpServletRequest httpRequest ) {
0 commit comments