Java 在Spring MVC中尝试使用OAuth保护资源

Java 在Spring MVC中尝试使用OAuth保护资源,java,spring-mvc,oauth,spring-security,Java,Spring Mvc,Oauth,Spring Security,我们已经在SpringMVC上用Java编写了RESTWeb服务,我一直在努力保护它们 OAuth服务器在另一个网站中实现,该网站负责登录和创建访问令牌。因此,在允许用户访问Web服务之前,我需要验证访问令牌是否正确 然而,使用OAuth的Spring安全性文档似乎非常糟糕,示例代码并没有实际解释它在做什么!我甚至不确定我是否应该为此实现它,因为它应该是如此简单的检查 保护这些web服务的最佳方式是什么?什么是最好的开始方式 谢谢你的帮助。重要 [编辑2012年12月27日:我下面引用的教程现在

我们已经在SpringMVC上用Java编写了RESTWeb服务,我一直在努力保护它们

OAuth服务器在另一个网站中实现,该网站负责登录和创建访问令牌。因此,在允许用户访问Web服务之前,我需要验证访问令牌是否正确

然而,使用OAuth的Spring安全性文档似乎非常糟糕,示例代码并没有实际解释它在做什么!我甚至不确定我是否应该为此实现它,因为它应该是如此简单的检查

保护这些web服务的最佳方式是什么?什么是最好的开始方式

谢谢你的帮助。

重要 [编辑2012年12月27日:我下面引用的教程现在抛出了404。github上有一个略为更新的版本。我已经浏览了一些看起来不好的链接。现在我把它留给子孙后代,因为现在缺少的教程是提问者引用的。据我所知,在此处包含的信息仍然有用,因此也许有一天当我有时间时,我会根据新教程重写它。]

这个答案假设“OAuth服务器是在另一个处理登录和创建访问令牌的网站上实现的。”您的意思是,您正在一个独立的站点上使用一项服务,而该站点不是您自己的


背景 我当然可以理解您的文档问题。Spring Security可以说是任何Spring项目中学习曲线最陡峭的,OAuth支持是相当新的,与Spring Security分开维护。Spring Security OAuth文档很少

如果你对OAuth感觉不好,那就去买一个吧!你要求你的用户相信你的网站实现这个标准的安全性。因此,你不能对这个主题有任何模糊的理解!最明显的出发点是在huniverse

如果/一旦您对OAuth的工作方式有了很好的了解,我强烈建议您阅读Spring Security“”和“”文档列表,以便大致了解Spring Security的实现方式

一旦您对Spring安全性和OAuth有了相当的了解,官方的Spring安全OAuth就开始有意义了。您需要特别注意您正在使用的OAuth版本(或)的消费者/客户机部分

同一个站点还为OAuth 1.0和OAuth 2.0提供了一个体面的平台,它基于上述服务的第二部分

访问受保护的Restful资源 对于您的问题,我们将重点介绍上述Tonr照片打印服务的实现。此服务打印由外部站点托管的受OAuth保护的资源的照片。Tonr将这些资源的访问控制权交给这些站点。这将包括重定向用户以进行用户身份验证和必要时进行身份验证确认

Spring MVC REST服务/控制器本身就是外部OAuth保护资源的使用者,通过使用请求过滤器实现这种“延迟授权”(我的术语)行为。根据1.0:

有两个请求筛选器 适用于OAuth用户 逻辑。第一个过滤器, 是 负责建立 OAuth特定的安全上下文,非常 类似于Spring Security的 .安全背景 只包含一组访问令牌 已获得的用于 当前用户。此安全上下文为 在请求 受保护的资源

还有另一个请求过滤器, 那个 可以应用于特定的URL或URL 需要访问 远程保护资源。正在放置 此过滤器位于Spring Security的 过滤链将确保 访问指定服务器所需的令牌 URL模式将在之前获得 允许访问资源

如您所见,对于OAuth 1.0,使用有效的
OAuthConsumerProcessingFilter
过滤请求将处理与获取有效访问令牌有关的所有事情,并在访问被拒绝时通知用户。同样,还有相应的和类

最后,设置完毕后,您可以使用
OAuthRestTemplate
OAuth2RestTemplate
访问控制器中受OAuth保护的资源,就像使用普通的
RestTemplate
访问未受保护的资源一样(信息)。但是,必须使用或的实例将它们注入到您的服务或控制器中

如果这听起来很复杂的话,我有一个好消息,所有这些废话通常都被抽象出来,并由OAuth和OAuth2XML名称空间为您处理

oauth名称空间在位于各自src/webapp/WEB-INF目录中的Tonr教程的XML配置文件中进行了演示。下面的示例直接从中缩写

如果您想了解提供者端在不使用OAuth名称空间的情况下是如何工作的,我建议您检查一下,并按照问题进行更新

OAuth 1.0示例 Tonr正在使用Sparkr和Google提供的受OAuth保护的服务,因此它使用
OAuth:resource details service
标记设置了一个名为
resourceDetails
ProtectedResourceDetails服务。然后,它使用设置了
OAuthConsumerContextFilter
OAuthConsumerProcessingFilter
通过使用
oauth:consumer
标记对
resourceDetails
的引用。通过使用
oauth:resource
标记为每个受保护的资源提供程序的
ProtectedResourceDetails
实例创建这些筛选器


来自tonr's applica