自定义spring-security AuthenticationProvider可以设置OAuth2安全上下文吗?

时间:2011-09-01 13:55:11

标签: spring-security oauth-2.0

我正在尝试设置一个spring 3 webapp,作为另一个使用oauth2为受保护资源提供服务的应用程序的代理。

我们使用的是UsernamePassword授权类型。 我的应用程序不应该知道用户数据库;实际上它会查询其他应用程序以获取有关用户的详细信息(他们拥有哪些权限,以及其他内容)。

我的应用负责显示登录页面。

我想使用自定义的spring-security AuthenticationProvider:

  • 连接到oauth服务器以获取访问令牌
  • 然后使用OAuth2RestTemplate查询尝试登录的用户,以获取其GrantedAuthorities和其他详细信息
  • 构建一个UserDetails。 (我的AuthenticationProvider将扩展AbstractUserDetailsAuthenticationProvider)

问题是:

  • 因为我正在使用配置我的spring应用程序,所以spring将OAuth2ClientSecurityContextFilter添加到过滤器链
  • 当我的AuthenticationProvider类的'retrieveUser'方法被调用时,此过滤器 尚未传递
  • 所以,如果我尝试在覆盖'retrieveUser'方法中使用OAuth2RestTemplate,我会得到一个例外:

    java.lang.IllegalStateException:未建立OAuth 2安全上下文。无法访问资源'avop-services'。 在org.springframework.security.oauth2.consumer.OAuth2ClientHttpRequestFactory.createRequest(OAuth2ClientHttpRequestFactory.java:38) 在org.springframework.http.client.support.HttpAccessor.createRequest(HttpAccessor.java:76) 在org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:434) 在org.springframework.web.client.RestTemplate.execute(RestTemplate.java:401)     ..等..

(因为这个话题我将它链接到OAuth2ClientSecurityContextFilter:http://forum.springsource.org/showthread.php?98141-error-No-OAuth-2-security-context-has-been-established

所以我的问题是:

  • 在其他一些过滤器播放之后让AuthenticationProvider启动是否有意义?
  • 如果是,可以控制过滤器的顺序吗?
  • 或者有没有办法将UserDetails的计算延迟到过滤器链的后期?

我知道这可能是一个非常具体的案例,但我想知道我是以正确的方式攻击它还是我错过了什么。

提前致谢。

1 个答案:

答案 0 :(得分:-3)

解决方案是使用在右侧位置添加过滤器。