UserDetails
About
In Spring Security, UserDetails
is an interface that represents a user account in the system. It contains user-related data such as username, password, roles, and account status (enabled, locked, etc.).
Spring Security uses UserDetails
to retrieve user information and validate credentials during authentication. It works together with UserDetailsService
to load user details from a database, an external system, or even in-memory storage.
Responsibilities of UserDetails
Stores user identity information (username, password, roles, account status).
Used by
UserDetailsService
to retrieve user details during authentication.Passed to
AuthenticationProvider
for credential validation.Customizable for additional user attributes (e.g., email, phone, permissions).
UserDetails Interface (Spring Security Built-in)
Spring Security provides the UserDetails
interface:
public interface UserDetails extends Serializable {
String getUsername();
String getPassword();
Collection<? extends GrantedAuthority> getAuthorities();
boolean isAccountNonExpired();
boolean isAccountNonLocked();
boolean isCredentialsNonExpired();
boolean isEnabled();
}
Method
Purpose
getUsername()
Returns the username of the user.
getPassword()
Returns the encoded password.
getAuthorities()
Returns a list of user roles/permissions.
isAccountNonExpired()
Checks if the account is still valid.
isAccountNonLocked()
Checks if the account is not locked.
isCredentialsNonExpired()
Checks if the password is not expired.
isEnabled()
Checks if the account is active.
Default Implementation: User Class
Spring Security provides a built-in implementation of UserDetails
through the User
class.
import org.springframework.security.core.userdetails.User;
UserDetails user = User.builder()
.username("admin")
.password("{noop}password") // No encoding used
.roles("ADMIN") // Adds ROLE_ADMIN
.build();
Uses Builder Pattern to create users easily.
Supports password encoding (e.g.,
{bcrypt}hashedPassword
).Automatically assigns ROLE_ prefix to roles.
Custom Implementation of UserDetails (For Database Authentication)
In real-world applications, we often fetch users from a database. Instead of using Spring’s default User
, we create our own UserDetails
implementation.
@Entity
public class CustomUser implements UserDetails {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String username;
private String password;
private boolean enabled;
@ManyToMany(fetch = FetchType.EAGER)
private List<Role> roles;
@Override
public Collection<? extends GrantedAuthority> getAuthorities() {
return roles.stream()
.map(role -> new SimpleGrantedAuthority(role.getName()))
.collect(Collectors.toList());
}
@Override
public String getPassword() {
return password;
}
@Override
public String getUsername() {
return username;
}
@Override
public boolean isAccountNonExpired() {
return true;
}
@Override
public boolean isAccountNonLocked() {
return true;
}
@Override
public boolean isCredentialsNonExpired() {
return true;
}
@Override
public boolean isEnabled() {
return enabled;
}
}
Stores user details in a database (
@Entity
).Implements
UserDetails
to be compatible with Spring Security.Retrieves roles dynamically and converts them to
GrantedAuthority
.
Last updated
Was this helpful?