Spring Security OpenID - UserDetailsS​​ervice,AuthenticationUserDetailsS​​ervice

And*_*lov 5 java openid spring spring-security

试图了解使用Spring Security实现OpenID身份验证的正确方法是什么.

public class OpenIDUserDetailsService implements 
  UserDetailsService, 
  AuthenticationUserDetailsService {

  @Override
  public UserDetails loadUserByUsername(String openId) throws
    UsernameNotFoundException, DataAccessException {

    // I either want user email here
    // or immediately delegate the request to loadUserDetails

  }

  @Override
  public UserDetails loadUserDetails(Authentication token) throws
    UsernameNotFoundException {

    // This never gets called if I throw from loadUserByUsername()

  }

  private MyCustomUserDetails registerUser(String openId, String email) {
    ...
  }
}
Run Code Online (Sandbox Code Playgroud)

我正在考虑用户尚未在我的应用程序中注册的情况.要注册用户,我需要知道它的OpenID和电子邮件.

当OpenID提供程序将用户重定向回我的应用程序时,会loadUserByUsername()被调用,但在这种情况下,我只知道用户的OpenID.所以,我正在投掷UsernameNotFoundException,然后loadUserDetails()永远不会被调用,所以我无法注册用户.

这里有什么常见的解决方案?如果我返回类似FakePartialUserDetailsloadUserByUsername(),然后当loadUserDetails()被调用时,我注册用户,然后返回真实MyCustomUserDetails

我正在使用Spring Security 3.0.7.RELEASE

And*_*lov 1

这很有趣,但通过迁移到Spring Security 3.1.0.RELEASE成功解决了这个问题。

对于相同的场景,行为是完全不同的——loadUserByUsername()不被调用,而是loadUserDetails()被调用。

  • 这是不正确的。在 3.1 中,OpenIDAuthenticationProvider 具有 UserDetailsS​​ervice 和 AuthenticationUserDetailsS​​ervice 的 setter,并根据使用的 setter 调用 loadUserByUsername 或 loadUserDetails。在 3.0.7 中,AuthenticationUserDetailsS​​ervice 没有 setter,因此它始终使用 loadUserByUsername。 (5认同)