From da2d9aa8682138b4f436f9be4874447ee9e2acc9 Mon Sep 17 00:00:00 2001 From: Josh Cummings <3627351+jzheaux@users.noreply.github.com> Date: Wed, 28 May 2025 14:01:46 -0600 Subject: [PATCH] Add Username Property to Exception Closes gh-17179 --- .../UsernameNotFoundException.java | 39 +++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/core/src/main/java/org/springframework/security/core/userdetails/UsernameNotFoundException.java b/core/src/main/java/org/springframework/security/core/userdetails/UsernameNotFoundException.java index d1d969dc26..eff0e13adb 100644 --- a/core/src/main/java/org/springframework/security/core/userdetails/UsernameNotFoundException.java +++ b/core/src/main/java/org/springframework/security/core/userdetails/UsernameNotFoundException.java @@ -31,12 +31,15 @@ public class UsernameNotFoundException extends AuthenticationException { @Serial private static final long serialVersionUID = 1410688585992297006L; + private final String name; + /** * Constructs a UsernameNotFoundException with the specified message. * @param msg the detail message. */ public UsernameNotFoundException(String msg) { super(msg); + this.name = null; } /** @@ -47,6 +50,42 @@ public class UsernameNotFoundException extends AuthenticationException { */ public UsernameNotFoundException(String msg, Throwable cause) { super(msg, cause); + this.name = null; + } + + private UsernameNotFoundException(String msg, String name, Throwable cause) { + super(msg, cause); + this.name = name; + } + + /** + * Construct an exception based on a specific username + * @param username the invalid username + * @return the {@link UsernameNotFoundException} + * @since 7.0 + */ + public static UsernameNotFoundException fromUsername(String username) { + return fromUsername(username, null); + } + + /** + * Construct an exception based on a specific username + * @param username the invalid username + * @param cause any underlying cause + * @return the {@link UsernameNotFoundException} + * @since 7.0 + */ + public static UsernameNotFoundException fromUsername(String username, Throwable cause) { + return new UsernameNotFoundException("user not found", username, cause); + } + + /** + * Get the username that couldn't be found + * @return the username + * @since 7.0 + */ + public String getName() { + return this.name; } }