试图了解使用 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) {
...
}
}
我正在考虑用户尚未在我的应用程序中注册的情况。要注册用户,我需要知道其 OpenID 和电子邮件。
当 OpenID 提供程序将用户重定向回我的应用程序时,loadUserByUsername()
会调用它,但在这种情况下,我只知道用户的 OpenID。所以,我在抛出UsernameNotFoundException
然后loadUserDetails()
永远不会被调用,所以我无法注册用户。
这里的常见解决方案是什么?如果我返回类似FakePartialUserDetails
fromloadUserByUsername()
然后,当loadUserDetails()
被调用时,我注册用户然后返回 realMyCustomUserDetails
怎么办?
我正在使用 Spring Security 3.0.7.RELEASE