我正在尝试在现有架构上配置Spring Boot OAuth2.0服务器。要使用我的架构对用户进行身份验证,我需要从users
表中检索加密的密码,并将其传递给外部服务进行验证。
我能够如下定义自定义UserDetailsService
,但默认行为是根据返回的UserDetails
对象中的密码与请求中的密码的比较进行身份验证。
如何自定义此行为以便我可以使用自定义UserDetailsService
,但将密码验证卸载到外部服务?
@Component("userDetailsService")
public class UserDetailsService implements org.springframework.security.core.userdetails.UserDetailsService {
@Autowired
private DataSource dataSource;
@Override
public UserDetails loadUserByUsername(final String login) {
String sql = "select encrypted_password from users where login_name = ?";
String encryptedPassword = null;
try {
Connection con = dataSource.getConnection();
PreparedStatement statement = con.prepareStatement(sql));
statement.setString(1, login);
try (ResultSet results = statement.executeQuery()) {
if (results.next()) {
encryptedPassword = results.getLong("encrypted_password");
}
}
} catch (SQLException e) {
e.printStackTrace();
}
return new User(login, encryptedPassword, Arrays.asList(new SimpleGrantedAuthority("simpleAuth")));
}
}
答案 0 :(得分:0)
我可能没有足够的细节来解决你的问题,但我会做出一些假设并给你最好的答案。
假设:用户必须使用您正在执行loadUserByUsername(loginCreds)
的某种凭据登录。
如果您不想使用该特定的UserDetails对象,可以使用CustomAuthenticationFilter
http.addFilterBefore(new CustomAuthenticationFilter(), UsernamePasswordAuthenticationFilter)
从那里,您可以自定义整个身份验证流程。您可以选择创建CustomAuthenticationToken
,然后通过CustomAuthenticationProvider
进行身份验证。在此提供程序中,您可以使用第三方验证进行密码检查。如果它通过,您可以像在那里一样加载用户对象。