🔑
Spring Security

Authentication

UserDetailsService, PasswordEncoder
💡 Authentication ek ID CARD CHECK hai entry gate par — guard tumhara ID CARD (credentials) dekhta hai, DATABASE se verify karता hai ("ye person REALLY exist karta hai?"), tabhi entry deta hai — ID card ke bina, koi bhi claim (username) matter nahi karti.

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
}
🔑
Authentication ek ID CARD CHECK hai entry gate par — guard tumhara ID CARD (credentials) dekhta hai, DATABASE se verify karता hai ("ye person REALLY exist karta hai?"), tabhi entry deta hai — ID card ke bina, koi bhi claim (username) matter nahi karti.
1 / 2
⚡ Quick Recap
  • 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
On this page (2 subtopics)

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.

⚠️Common Mistake: Plain text passwords database mein store karna EK CRITICAL security vulnerability hai — HAMESHA BCryptPasswordEncoder (ya isi jaisa strong hashing) use karo, KABHI apna khud ka encryption scheme mat banaओ.