Authentication
Authentication process mein UserDetailsService ek KEY role play karta hai — ye interface Spring Security ko batata hai "user data KAHA SE fetch karna hai" (database, LDAP, kahin bhi). loadUserByUsername() method IMPLEMENT karके, username se USER details (password, roles) load kiye jaate hain.
Passwords KABHI plain text mein STORE nahi hote — PasswordEncoder (typically BCryptPasswordEncoder) unhe HASH karta hai. Login ke waqt, entered password ko HASH karके, STORED hash se COMPARE kiya jaata hai — plain text passwords KABHI compare NAHI hote directly.
@Service
public class CustomUserDetailsService implements UserDetailsService {
private final UserRepository repository;
@Override
public UserDetails loadUserByUsername(String username) {
User user = repository.findByUsername(username)
.orElseThrow(() -> new UsernameNotFoundException("User not found"));
return org.springframework.security.core.userdetails.User
.withUsername(user.getUsername())
.password(user.getPasswordHash())
.roles(user.getRole())
.build();
}
}
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder(); // HAMESHA hashed passwords
}- UserDetailsService = user data KAHA SE fetch karna hai batata hai
- PasswordEncoder (BCrypt) = passwords HASH karके store hote hain
- Login: entered password HASH karके STORED hash se compare hota hai
UserDetailsService ek INTERFACE hai jo Spring Security ko batata hai "USER ka data KAHA SE, KAISE fetch karna hai" — loadUserByUsername() method IMPLEMENT karके, database (ya kisi bhi source) se user details (username, password, roles) load kiye ja sakte hain.
@Service
public class CustomUserDetailsService implements UserDetailsService {
private final UserRepository repository;
public UserDetails loadUserByUsername(String username) {
User user = repository.findByUsername(username)
.orElseThrow(() -> new UsernameNotFoundException("Not found"));
return org.springframework.security.core.userdetails.User
.withUsername(user.getUsername())
.password(user.getPassword()) // already-HASHED password
.roles(user.getRole())
.build();
}
}PasswordEncoder interface (usually BCryptPasswordEncoder) passwords ko HASH karta hai STORE karne se PEHLE — plain text passwords KABHI database mein store nahi hote. BCrypt SLOW-BY-DESIGN algorithm hai — brute-force attacks ko EXPENSIVE banata hai.