AuthenticationProviderConfig.java 3.2 KB
package com.objecteye.config;

import com.objecteye.pojo.AuthenticationToken;
import org.springframework.security.authentication.*;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.AuthenticationException;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.crypto.password.PasswordEncoder;

public class AuthenticationProviderConfig implements AuthenticationProvider {

    private UserDetailsService userDetailsService;

    private PasswordEncoder passwordEncoder;

    public void setUserDetailsService(UserDetailsService userDetailsService) {
        this.userDetailsService = userDetailsService;
    }

    public void setPasswordEncoder(PasswordEncoder passwordEncoder) {
        this.passwordEncoder = passwordEncoder;
    }

    /**
     * 用户默认检查,用户是否锁定过期等
     */
    private void defaultCheck(UserDetails user) {
        if (!user.isAccountNonLocked()) {
            throw new LockedException("User account is locked");
        }

        if (!user.isEnabled()) {
            throw new DisabledException("User is disabled");
        }

        if (!user.isAccountNonExpired()) {
            throw new AccountExpiredException("User account has expired");
        }
    }

    /**
     * (附加检查项)检查密码是否正确
     */
    private void additionalAuthenticationChecks(UserDetails userDetails,
                                                AuthenticationToken authenticationToken) throws AuthenticationException {
        if (authenticationToken.getCredentials() == null) {
            throw new BadCredentialsException("username or password is wrong!");
        }
        String presentedPassword = authenticationToken.getCredentials().toString();
        if (!passwordEncoder.matches(presentedPassword, userDetails.getPassword())) {
            throw new BadCredentialsException("username or password is wrong!");
        }
    }

    /**
     * 创建一个认证成功的Authentication对象,传入的是一个还没有认证的Authentication对象
     *
     * @param authentication 未认证的
     * @return
     * @throws AuthenticationException
     * @see AuthenticationToken#AuthenticationToken(Object, Object)
     */
    @Override
    public Authentication authenticate(Authentication authentication) throws AuthenticationException {
        String userName = authentication.getName();
        UserDetails userDetails = userDetailsService.loadUserByUsername(userName);
        AuthenticationToken checkToken = (AuthenticationToken) authentication;
        defaultCheck(userDetails);
        additionalAuthenticationChecks(userDetails, checkToken);
        AuthenticationToken authenticationToken = new AuthenticationToken(userDetails, checkToken.getCredentials(), userDetails.getAuthorities());
        authenticationToken.setDetails(checkToken.getDetails());
        return authenticationToken;
    }

    /**
     * 判断token是否是该类型
     *
     * @param aClass
     * @return
     */
    @Override
    public boolean supports(Class<?> aClass) {
        return AuthenticationToken.class.isAssignableFrom(aClass);
    }
}