如何使用Spring Security OAuth2提供程序配置指定要保护的资源

时间:2011-08-05 12:36:41

标签: spring-mvc spring-security oauth-2.0

我目前正在实施一个Spring MVC应用程序,它既是OAuth客户端(从某种意义上说它消耗来自第三方服务提供商的数据),也是一个OAuth2服务提供商(从某种意义上说它应该为第三方提供方法) party oauth客户端从专用的REST api中使用此应用程序中的数据。

虽然我对OAuth客户端的应用程序实现没有任何问题,但我的OAuth2服务提供商配置干扰了应用程序与服务提供商进行身份验证的能力 - 如果我启用Oauth2配置,它似乎拦截了回调来自第三方服务提供商的应用程序。禁用它会使应用程序返回其正常工作状态。

我假设这是因为我没有指定我想要oauth2提供商管理哪些网址完全 - 但我看不出任何指定方式。

为了简化问题,我如何配置Spring Security OAuth2提供程序来管理一个url根目录(例如'/ restapi / *'),并且仅限此URL,并完全忽略所有其他URL?我看过resources at the projects homepage,但没有任何东西在向我跳来......

这可能取决于我如何定义我的安全拦截网址,在这种情况下,它可能不是OAuth2特定的问题,而是如何将不同的安全方案应用于不同的网址方案。关于如何做到这一点的任何建议都会很棒!

1 个答案:

答案 0 :(得分:1)

开箱即用,您将无法使用Spring Security 3.0,但您可以在3.1中使用。根据{{​​3}}:

  

在Spring Security 3.1中,您将能够使用多个http   元素来创建多个过滤器链。每个链处理不同   应用程序中的路径,例如,下面的无状态API   URL / rest / **和所有的有状态Web应用程序配置   其他要求。

要执行您想要的操作,您可以将提供程序安全筛选器子类化,并覆盖doFilter()以仅应用于某些URL。

如果使用命名空间配置,则需要使用子类过滤器替换过滤器链中的相应过滤器。有点痛,但可行。例如,以下是我为自定义VerificationCodeFilter执行的操作:

override def afterPropertiesSet() {
  setVerificationServices(springVerificationCodeFilter.getVerificationServices)
  setClientDetailsService(springVerificationCodeFilter.getClientDetailsService)
  setUserApprovalHandler(springVerificationCodeFilter.getUserApprovalHandler)
  super.afterPropertiesSet()

  val filterChainMap = filterChainProxy.getFilterChainMap
  val filterChain = filterChainMap.find(_._2.exists(_.isInstanceOf[SpringVerificationCodeFilter])).
                    getOrElse(throw new Exception("Could not find VerificationCodeFilter in FilterChainMap"))._2
  val index = filterChain.indexOf(springVerificationCodeFilter)
  filterChain.remove(index)
  filterChain.add(index, this)
}