DaoAuthenticationProvider.java

package sprout.security.authentication;

import sprout.beans.InfrastructureBean;
import sprout.security.authentication.exception.AccountExpiredException;
import sprout.security.authentication.exception.BadCredentialsException;
import sprout.security.authentication.exception.CredentialExpiredException;
import sprout.security.authentication.exception.UsernameNotFoundException;
import sprout.security.authentication.password.PasswordEncoder;
import sprout.security.core.Authentication;
import sprout.security.core.UserDetails;
import sprout.security.core.UserDetailsService;

import javax.naming.AuthenticationException;

public class DaoAuthenticationProvider implements AuthenticationProvider, InfrastructureBean {

    private final UserDetailsService userDetailsService;
    private final PasswordEncoder passwordEncoder;

    public DaoAuthenticationProvider(UserDetailsService userDetailsService, PasswordEncoder passwordEncoder) {
        this.userDetailsService = userDetailsService;
        this.passwordEncoder = passwordEncoder;
    }

    @Override
    public boolean supports(Class<?> authentication) {
        return authentication.equals(UsernamePasswordAuthenticationToken.class);
    }

    @Override
    public Authentication authenticate(Authentication authentication) throws AuthenticationException {
        UsernamePasswordAuthenticationToken unauthenticatedToken = (UsernamePasswordAuthenticationToken) authentication;
        String username = unauthenticatedToken.getPrincipal().toString();
        String rawPassword = unauthenticatedToken.getCredentials().toString();

        UserDetails userDetails;
        try {
            userDetails = userDetailsService.loadUserByUsername(username);
        } catch (UsernameNotFoundException notFound) {
            System.out.println("User '" + username + "' not found.");
            throw new BadCredentialsException("Bad credentials", notFound);
        }

        if (!passwordEncoder.matches(rawPassword, userDetails.getPassword())) {
            System.out.println("Invalid password for user '" + username + "'");
            throw new BadCredentialsException("Bad credentials");
        }

        if (!userDetails.isAccountNonExpired()) {
            throw new AccountExpiredException("User account has expired");
        }
        if (!userDetails.isAccountNonLocked()) {
            throw new AccountExpiredException("User account is locked");
        }
        if (!userDetails.isCredentialsNonExpired()) {
            throw new CredentialExpiredException("User credentials have expired");
        }
        if (!userDetails.isEnabled()) {
            throw new AccountExpiredException("User account is disabled");
        }

        return new UsernamePasswordAuthenticationToken(userDetails, null, userDetails.getAuthorities());
    }
}