Performance: UserDetailsService implementation
This affects the authentication process speed and responsiveness during user login.
Jump into concepts and practice - no test required
public class MyUserDetailsService implements UserDetailsService { @Override public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { // Fetch user and roles in a single optimized query User user = userRepository.findUserWithRolesByUsername(username); return new org.springframework.security.core.userdetails.User(user.getUsername(), user.getPassword(), mapRolesToAuthorities(user.getRoles())); } }
public class MyUserDetailsService implements UserDetailsService { @Override public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { // Fetch user from database with multiple queries User user = userRepository.findByUsername(username); List<Role> roles = roleRepository.findRolesByUserId(user.getId()); // Build UserDetails manually return new org.springframework.security.core.userdetails.User(user.getUsername(), user.getPassword(), mapRolesToAuthorities(roles)); } }
| Pattern | Database Queries | Authentication Delay | Server Load | Verdict |
|---|---|---|---|---|
| Multiple queries per login | 2+ queries | 50-100ms delay | High under load | [X] Bad |
| Single optimized query | 1 query | 10-20ms delay | Low | [OK] Good |
What is the main purpose of implementing UserDetailsService in Spring Boot?
Which method must be overridden when implementing UserDetailsService?
Given this UserDetailsService implementation snippet, what happens if the user is not found?
public UserDetails loadUserByUsername(String username) {
Optional<User> user = userRepository.findByUsername(username);
if (user.isEmpty()) {
throw new UsernameNotFoundException("User not found");
}
return new CustomUserDetails(user.get());
}Identify the error in this UserDetailsService implementation:
public UserDetails loadUserByUsername(String username) {
User user = userRepository.findByUsername(username);
if (user == null) {
return null;
}
return new CustomUserDetails(user);
}You want to implement UserDetailsService to load users from a database and assign roles dynamically. Which approach correctly combines fetching user data and setting roles?
public UserDetails loadUserByUsername(String username) {
User user = userRepository.findByUsername(username)
.orElseThrow(() -> new UsernameNotFoundException("User not found"));
List<GrantedAuthority> authorities = user.getRoles().stream()
.map(role -> new SimpleGrantedAuthority(role.getName()))
.toList();
return new org.springframework.security.core.userdetails.User(
user.getUsername(), user.getPassword(), authorities);
}