如何使用 Spring Security 在 Spring App 中测试 REST

Posted

技术标签:

【中文标题】如何使用 Spring Security 在 Spring App 中测试 REST【英文标题】:How to test REST in spring app with spring security 【发布时间】:2012-05-10 20:45:07 【问题描述】:

我有带有球衣休息服务的 Spring Web 应用程序。然而,休息是通过弹簧安全保护的,登录过程很难从单元测试代码中执行。我想在禁用整个春季安全性的情况下测试休息服务。有没有可能?

【问题讨论】:

【参考方案1】:

你没有说什么是“困难的”,所以我假设你在你的 REST 服务中有一些东西,即在你想要测试的 java 方法中,这需要身份验证结果。 Spring 具有用于模拟身份验证结果的实用程序。例如,您可以在 @Before 设置方法中执行以下操作:

Object principal = null; // fix this
Object credentials = null; // fix this
Authentication auth = new org.springframework.security.authentication.TestingAuthenticationToken(principal, credentials);
SecurityContextHolder.getContext().setAuthentication(auth);

但同样,你还没有说你真正想解决什么问题......

【讨论】:

【参考方案2】:

只需将其作为 pojo 进行测试。传入任何内容,返回任何内容,根本不加载应用程序上下文 - 这将是一个集成测试。

能够在不加载框架的情况下轻松测试功能是 Spring 的主要优势之一。

【讨论】:

【参考方案3】:

基于注释的 Web 服务的优点之一是您可以轻松地对它们进行单元测试。

class WebServiceEndpoint 

    @Path("/foo/fooId")
    @POST
    @Produces( MediaType.APPLICATION_XML )
    public Response doFoo(@PathParam("fooId") Integer fooId)  
        /// ... web service endpoint implementation
    


如果你使用 Spring 的 servlet 过滤器来保证安全,那么 doFoo 方法中不应该有任何与安全相关的代码,所以你可以创建一个新的 WebServiceEndpoint 类并调用该方法。所以这是“禁用”安全性的一种方式。

当您说登录过程“困难”时,您是什么意思?如果您已成功登录一次,那么您可以在其他单元测试中重用相同的代码(例如在 @Before 方法中)。

【讨论】:

以上是关于如何使用 Spring Security 在 Spring App 中测试 REST的主要内容,如果未能解决你的问题,请参考以下文章

使用 Spring Security Saml 和 SP 应用程序的无状态会话

在期待多个应用程序时,我应该使用 Spring Security SAML 还是 Shiboleth SP?

Spring security Saml - SP 和 IDP 的时间差

如何使用 Spring MVC & Security、Jasig CAS 和 JSP 视图在 Spring Boot 2 中配置 UTF-8?

生成 SP 元数据时出现意外的堆栈跟踪表单 Spring-Security-SAML?

在进行跨域请求时,如何使用 SockJS 和 STOMP 添加 Spring Security JSESSIONID?