使用 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。 在<http>
标签中添加:<security:intercept-url pattern="your url" access="hasAnyRole('Your_User_Role1', 'Your_User_Role2')" />
。
或者尝试使用注释。在您的 spring-config.xml 中启用安全注释:<security:global-method-security jsr250-annotations="enabled" pre-post-annotations="enabled" secured-annotations="enabled"/>
并在控制器中添加 @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 配置文件之一中可能已经有一个 <http>
部分。您可以使用此部分来保护您的 REST API。
<http>
本身并不保护任何东西。您必须在其中添加<intercept-url>
规则:
<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 如何保护整个微服务架构?