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

标签 java spring spring-security openid

试图了解使用 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 - UserDetailsS​​ervice,AuthenticationUserDetailsS​​ervice,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10927633/

相关文章:

java - Spring 安全 session 超时

spring - 使用 Spring 3.0.5 和 Jackson 向 Tomcat 发出 JSON PUT 请求时出现 403

java - 查询多个 SQL 表中的某些列值并复制/更新到不同模式中的表

java - HashMap.get() 与继承的 hashCode() 方法一起正常工作,无法识别用户定义的 hashCode() 方法的键

java - hibernate 中的 save() 和 persists() 方法在级联方面有什么区别?

java - 如何将身份验证成功处理程序分配给多个 Spring Security 领域

java - 如何确保最高优先级线程最先/最好地访问CPU?

java - ReSTLet + Jackson - 在哪里注册模块

unit-testing - Spring TestContext Framework 和 Jboss Arquillian 的区别

Grails3 spring security core 3不能使用域对象