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

Posted

技术标签:

【中文标题】如何使用 Spring Security OAuth2 提供程序配置指定要保护的资源【英文标题】:How to specify which resources to protect with Spring Security OAuth2 provider configuration 【发布时间】:2011-10-20 20:18:10 【问题描述】:

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

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

我假设这是因为我没有指定我希望 oauth2 提供程序管理的网址 独家 - 但我看不到任何指定方式。

为了简化问题,我如何配置 Spring Security OAuth2 提供程序来管理一个 url 根(例如“/restapi/*”),并且只管理这个 url,而它完全忽略所有其他 url?我看过resources at the projects homepage,但没有任何东西在我身上跳出来......

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

【问题讨论】:

【参考方案1】:

使用 Spring Security 3.0 开箱即用您将无法做到这一点,但您可以在 3.1 中做到这一点。根据this blog post:

在 Spring Security 3.1 中,您将能够使用多个 http 元素来创建多个过滤器链。每个链条处理不同的 应用程序中的路径,例如 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)

【讨论】:

感谢 Eric 的提示-我会试一试!碰巧的是,我使用的是 ssec3.1,但我是新手,所以对新手问题表示歉意;但确实意味着如果不这样做,我就无法指定哪些安全方案映射到哪些 url 方案?从我的角度来看,这就是它的样子,我希望避免自定义过滤器链,只是这似乎是 ssec 的一个重大疏忽。顺便说一句有趣的博文!

以上是关于如何使用 Spring Security OAuth2 提供程序配置指定要保护的资源的主要内容,如果未能解决你的问题,请参考以下文章

在没有 servlet api 的 webflux 项目中使用 OAuth2 和 Spring Security OAuth2 和 reactor netty

具有密码授予类型的 WebClient 的 Spring Security OAuth 客户端不要求新令牌

Spring security:Spring security 如何在 SessionRegistry 中注册新会话?

如何使用 Spring Security 模拟身份验证和授权

如何禁用 spring-security 登录屏幕?

如何使用 Spring-Security 3 和 Hibernate 4 将 spring security xml 配置 hibernate 转换为 java config