Spring OAuth2 安全单元测试

Posted

技术标签:

【中文标题】Spring OAuth2 安全单元测试【英文标题】:Spring OAuth2 Security Unit Testing 【发布时间】:2015-11-14 12:44:30 【问题描述】:

我已经从一周开始学习 OAuth2 Spring Security,如果问题很简单,请原谅。这个话题对我来说似乎很容易,直到我开始研究它。 我将在我的应用程序中为 Rest 端点编写测试。为此,我将为我的资源类编写测试。但我的应用程序使用的是 OAuth2。

第一个想法是为此测试配置单独的授权服务器扩展 AuthorizationServerConfigurerAdapter。我已将 ClientDetailsS​​ervice 配置为持久保存在内存中并添加了 InMemoryTokenService。但它不起作用。响应为 401 - 未经授权。

现在我只想提供 bean DefaultTokenServices 并以某种方式省略授权服务器(但如何?)。我没有更改“生产”资源服务器中的任何内容。

我知道如何添加不记名令牌。我正在使用 OAuth2RestTemplate 编写测试,并将访问令牌添加到 OAuth2ClientContext。我使用构造函数 DefaultOAuth2AccessToken(String value) 创建访问令牌。我知道有 TestRestTemplate 但在这种情况下 OAuth2RestTemplate 对我来说似乎更好。我正在使用 Spring Boot,也许这会有所帮助?

我的问题是: 1. 最好的解决方案是什么?配置 OAuth2 以执行 Rest 端点测试的最佳方法是什么?如何在没有授权服务器的情况下执行测试?也许我的理解不恰当? 2 有没有办法模拟对授权服务器的请求?怎么做?

提前感谢您的合作。

我阅读了很多资料,包括: http://projects.spring.io/spring-security-oauth/docs/oauth2.html 但我没有找到答案。

【问题讨论】:

有没有为此想出解决方案? 【参考方案1】:

提供准确答案所需的更多信息:

    您是在编写单元测试还是集成测试?

如果进行单元测试,您根本不应该使用授权服务器。您只需要为您的 mockMvc 查询(或响应式等效项)正确设置 SecurityContext。

如果是集成测试,Spring 会为此提供工具,但我将专注于单元测试,因为我知道您正在尝试编写它。

    您使用的是什么版本的 spring 库?

spring-security-oauth2 已弃用并且不支持单元测试,但我在other question 的答案中详细说明了如何创建注释来配置这样的安全上下文。

从 5.2 版(选择​​最新的里程碑)开始,spring-security-test 基本支持使用 JWT 保护的 @Controller 单元测试。如果您使用自省或安全@Service,则必须参考this lib I wrote,因为 spring-security 团队选择仅集成我的一小部分工作。

【讨论】:

以上是关于Spring OAuth2 安全单元测试的主要内容,如果未能解决你的问题,请参考以下文章

使用 Spring Security 进行 Spring Boot 单元测试

如何在单元测试中针对 Spring Security 对用户进行身份验证

如何对使用 thymeleaf 的安全控制器进行单元测试(不获取 TemplateProcessingException)?

在使用 spring-session 的单元测试中,身份验证不应为空

如何使用 grails 在单元测试中模拟 springSecurityService

2539-SpringSecurity系列--在有安全验证的情况下做单元测试Test