如何使用自定义UserDetailsS​​ervice和密码验证配置Spring Boot OAuth2.0服务器?

时间:2017-11-07 21:22:21

标签: java spring spring-boot spring-security

我正在尝试在现有架构上配置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")));
    }
}

1 个答案:

答案 0 :(得分:0)

我可能没有足够的细节来解决你的问题,但我会做出一些假设并给你最好的答案。

假设:用户必须使用您正在执行loadUserByUsername(loginCreds)的某种凭据登录。

如果您不想使用该特定的UserDetails对象,可以使用CustomAuthenticationFilter

创建在WebSecurity类中配置的http.addFilterBefore(new CustomAuthenticationFilter(), UsernamePasswordAuthenticationFilter)

从那里,您可以自定义整个身份验证流程。您可以选择创建CustomAuthenticationToken,然后通过CustomAuthenticationProvider进行身份验证。在此提供程序中,您可以使用第三方验证进行密码检查。如果它通过,您可以像在那里一样加载用户对象。