@Slf4j
@Component
public class LDAPAuthenticationProvider implements AuthenticationProvider {
@Autowired
private UserDetailsService adminUserDetailsService;
@Autowired
private PasswordEncoder passwordEncoder;
@Autowired
private MyLdapProperties myLdapProperties;
//覆写认证方法
@Override
public Authentication authenticate(Authentication authentication) throws AuthenticationException {
UsernamePasswordAuthenticationToken adminLoginToken = (UsernamePasswordAuthenticationToken) authentication;
UserDetails userDetails = adminUserDetailsService.loadUserByUsername(adminLoginToken.getName());
log.info(authentication.getPrincipal().toString()+"===================="+authentication.getCredentials().toString());
if (ldapLogin(authentication.getPrincipal().toString(), authentication.getCredentials().toString())) {
return new UsernamePasswordAuthenticationToken(userDetails, userDetails.getPassword(), userDetails.getAuthorities());
}
throw new BadCredentialsException("用户名密码不正确");
}
@Override
public boolean supports(Class<?> authentication) {
return UsernamePasswordAuthenticationToken.class.isAssignableFrom(authentication);
}
private boolean ldapLogin(String username, String password) throws AuthenticationException {
long start = System.currentTimeMillis();
Hashtable<String, String> HashEnv = new Hashtable<>();
HashEnv.put(Context.PROVIDER_URL, myLdapProperties.getUrls());//改成实际ldap配置信息
// LDAP访问安全级别(none,simple,strong)
HashEnv.put(Context.SECURITY_AUTHENTICATION, "simple");
//AD的用户名
HashEnv.put(Context.SECURITY_PRINCIPAL, username);//改成实际ldap配置信息
//AD的密码
HashEnv.put(Context.SECURITY_CREDENTIALS, password);//改成实际ldap配置信息
HashEnv.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
//连接超时设置为3秒
HashEnv.put("com.sun.jndi.ldap.connect.timeout", "3000");
//env.put("com.sun.jndi.ldap.connect.timeout", 3000L);
ctx = null;
Control[] connCtls = null;
LdapContext ctx = new InitialLdapContext(HashEnv, connCtls);
log.info( "认证成功" );
log.info("----------------"+(System.currentTimeMillis()-start));
return true;
}
}