作者热门文章
- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
试图了解使用 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()
永远不会被调用,所以我无法注册用户。
这里的常见解决方案是什么?如果我从 loadUserByUsername()
返回类似 FakePartialUserDetails
的内容,然后在调用 loadUserDetails()
时注册用户,然后返回真正的 MyCustomUserDetails
?
我正在使用 Spring Security 3.0.7.RELEASE
最佳答案
这很有趣,但通过迁移到 Spring Security 3.1.0.RELEASE 设法解决了这个问题。
对于相同的场景,行为是完全不同的 - loadUserByUsername()
没有被调用,而是调用了 loadUserDetails()
。 p>
关于java - Spring Security OpenID - UserDetailsService,AuthenticationUserDetailsService,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10927633/
我是一名优秀的程序员,十分优秀!