使用 Spring Security 保护 REST API

Posted

技术标签:

【中文标题】使用 Spring Security 保护 REST API【英文标题】:Securing REST API with Spring Security 【发布时间】:2014-02-21 05:30:31 【问题描述】:

我正在尝试为我的 Spring 应用程序实现一个 REST API。因为有些资源可能不是每个人都可以访问的,所以我需要一个安全层。

在这个应用程序中,我已经在使用 Spring Security(它工作得非常好)来保护我的 Web 应用程序。

我已将以下http 配置添加到我的spring-security.xml

<http pattern = "/api/**" use-expressions = "true" disable-url-rewriting = "true">
    <http-basic />
</http>

所以我假设所有对以api/ 开头的 URL 的请求都是安全的。

问题是我无需任何身份验证即可访问我的安全方法。但如果我使用 REST 客户端访问它,我会收到此错误:

message: Full authentication is required to access this resource
description: This request requires HTTP authentication.

我不知道如何继续。 的最佳方法是什么?

【问题讨论】:

您如何访问您说您在未经身份验证的情况下看到它们的安全方法?通过浏览器?您是否已经使用登录用户的浏览器? 【参考方案1】:

只需使用 Spring Security。&lt;http&gt; 标签中添加:&lt;security:intercept-url pattern="your url" access="hasAnyRole('Your_User_Role1', 'Your_User_Role2')" /&gt;。 或者尝试使用注释。在您的 spring-config.xml 中启用安全注释:&lt;security:global-method-security jsr250-annotations="enabled" pre-post-annotations="enabled" secured-annotations="enabled"/&gt; 并在控制器中添加 @PreAuthorize

@PreAuthorize("hasAnyRole('Your_User_Role1', 'Your_User_Role2')")
@RequestMapping(value = "/address_planing/load_employee_info")

【讨论】:

【参考方案2】:

Spring 官网有教程。这有点复杂: Official Spring Tuto

【讨论】:

我不使用 JavaConfig,另外我有两个安全上下文(webapp 和 rest api)。【参考方案3】:

如果您在应用程序中使用 Spring Security,您的 Spring 配置文件之一中可能已经有一个 &lt;http&gt; 部分。您可以使用此部分来保护您的 REST API。

&lt;http&gt; 本身并不保护任何东西。您必须在其中添加&lt;intercept-url&gt; 规则:

<intercept-url pattern="/api/**" access="hasRole('ROLE_USER')" />

【讨论】:

但我在控制器中使用@PreAuthorize。所以我认为我不需要它。我不在其他 http 部分中使用。无论如何,问题是,通过浏览器进行的身份验证工作正常,但不适用于我的 REST 客户端。

以上是关于使用 Spring Security 保护 REST API的主要内容,如果未能解决你的问题,请参考以下文章

使用 Spring Security 保护 REST API

使用 spring-security-oauth2 2.0.5.RELEASE 保护 Spring REST 服务

如何使用 Spring Security 和 Angularjs 保护 Spring Rest 服务?

使用 Spring Security Rest 插件保护 Grails Rest Api

Spring starter security or spring cloud security 如何保护整个微服务架构?

使用 Spring Security 保护 REST 微服务