gpt4 book ai didi

java - Spring Security 自定义身份验证 - AuthenticationProvider 与 UserDetailsS​​ervice

转载 作者:IT老高 更新时间:2023-10-28 13:44:55 28 4
gpt4 key购买 nike

据我所知,当您希望在 Spring Security 中进行自定义身份验证时,您可以实现自定义 AuthenticationProvider 或自定义 UserDetailsS​​ervice

@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
auth
//.authenticationProvider(authProvider) // option 1
.userDetailsService(userDetailsService); // option 2

}

在 AuthenticationProvider 中,您可以检查用户名和密码并返回 Authentication 以及您的自定义对象。

public Authentication authenticate(Authentication authentication){
if (checkUsernameAndPassword(authentication)) {
CustomUserDetails userDetails = new CustomUserDetails();
//add whatever you want to the custom user details object
return new UsernamePasswordAuthenticationToken(userDetails, password, grantedAuths);
} else {
throw new BadCredentialsException("Unable to auth against third party systems");
}
}

UserDetailsS​​ervice 中,您只获得用户名,当您返回自定义 UserDeatails 时,框架会检查密码。

public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
CustomUserDetails user = new CustomUserDetails();
//add whatever you want to the custom user details object
return user;
}

看起来两者都可以产生相似的结果。所以问题是有什么区别?何时使用一个与另一个?

最佳答案

答案在您的问题中。当您使用不同的身份验证系统,并且您自己的数据库/数据模型中未提供密码时,您必须使用 AuthenticationProvider。例如,我在一个项目中工作过,客户有一个集中式身份验证系统(CAS),所以我的系统不知道密码,我必须实现 AuthenticationProvider 并将给定的密码发送到 CAS,并按照到它的答案。

但在另一个系统中,我将密码存储在我的数据库中,所以我所要做的就是实现 UserDetailsS​​ervice 并检查用户是否存在于我的数据库中,其余的由 spring-security 完成。

关于java - Spring Security 自定义身份验证 - AuthenticationProvider 与 UserDetailsS​​ervice,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31630818/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com