- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在使用 Cucumber 测试来测试启用了 Spring Security 的 Spring Boot 应用程序。一切正常,除非我使用 Cucumber 测试运行我的测试套件,一些使用 Spring Security 的测试,例如。
@WithMockUser(username = "BROWSER", roles =
{"BROWSER","ADMIN"})
失败。如果我将它们作为简单的 junit 测试单独运行,这些测试确实有效,但在使用 Cucumber 测试步骤运行时失败。当我对 Cucumber 测试运行相同的行为时,问题看起来像是 spring 安全测试模拟行为没有得到应用。
我的 cucumber 测试运行类如下
@RunWith(Cucumber.class)
@CucumberOptions(features = "src/test/resources", monochrome = true, format =
{"pretty", "html:src/main/resources/static/cucumber"})
public class CucumberTests
{
}
我还注意到通过 Maven 使用 <reuseForks>false</reuseForks>
运行时同样有效.此外,如果未选中此选项,maven 触发的测试用例运行也会失败。
更新
AbstractIntegrationTest 类所有测试扩展
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = Services.class,loader = SpringApplicationContextLoader.class)
//@IntegrationTest
@WebIntegrationTest(randomPort = true)
public abstract class AbstractIntegrationTest {
另一个不起作用的用例是使用这些注释是 cucumber 特征条件,如下所示
@When("^I apply a GET on (.*)$")
@WithMockUser(username = "BROWSER", roles = { "BROWSER", "ADMIN" })
public void i_search_with_rsql(String query) throws Throwable {
result = mvc.perform(get(uri, query));
}
关于此的任何帮助或解决方法。
最佳答案
WithMockUser
不适用于 Cucumber。请改用 cucumber 钩。
WithMockUser
依赖于来自 Spring 测试上下文支持的 TestExecutionListener#beforeTestMethod
,但在使用 Cucumber runner 运行时不会调用它们。这是因为 Cucumber 运行由步骤组成的场景,而不是标准的 JUnit 测试方法。
选项 1 - 安全上下文 Hook 。您可以使用 Hook 设置安全上下文,例如:
@ActiveProfiles("test")
@SpringBootTest(classes = MyServer.class)
@AutoConfigureMockMvc
@AutoConfigureRestDocs
@AutoConfigureCache
public class MyServerContextHooks {
@Before
public void onBeforeScenario(final Scenario scenario) {
// This method does nothing - context setup is done with annotations
}
}
场景注释示例:
@WithAdminUser
Scenario: Run action as admin
...
在场景中使用注释的示例钩子(Hook):
public class TestUserHooks {
@Before("@WithAdminUser")
public void setupAdminUser() {
SecurityContextHolder.getContext().setAuthentication(
new UsernamePasswordAuthenticationToken(
"admin",
"N/A",
createAuthorityList("admin")));
}
}
选项 2 - 身份验证步骤。另一种方法是使用特殊步骤将用户提供给 mockMvc:
Scenario: Run action as admin
Given I am logged in as admin
...
Stepdef 示例:
public class SecurityTestSteps {
@Autowired
private MockMvcGlue mockMvc;
@Autowired
private OAuth2Mocks oauth2Mocks;
@Autowired
private TestUsers users;
/**
* Provides a one of predefined role-based authentications for the current request.
*/
@Given("^I am logged in as (admin|editor|user)$")
public void given_UserIsAuthenticatedWithRole(final String role) {
switch (role) {
case "admin":
mockMvc.request().with(authentication(oauth2Mocks.auth(users.admin())));
break;
case "editor":
mockMvc.request().with(authentication(oauth2Mocks.auth(users.edtior())));
break;
default:
throw new CucumberException("Unsupported role <" + role + ">");
}
}
}
关于java - Spring Security @WithMockUser 不适用于 cucumber 测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36584184/
如何在 Spring security 单元测试中运行具有不同角色的每一行代码?使用时@WithMockUser只能以选定的权限运行整个方法,但我想以不同的权限运行每一行代码,所以我需要一个无注释的解
我正在使用 spring OAuth2 和 JWT token 来保护应用程序。我正在扩展 org.springframework.security.core.userdetails 以便向 toke
尽管我的测试方法使用@WithMockUser 进行了注释,但我仍然遇到访问被拒绝的情况。为什么这在集成测试中不起作用?使用@WebAppConfiguration 和 MockMvc 测试一切正常。
我已经使用 Spring Security 以经典方式在我的 Controller 中设置了基本身份验证,如下所示: @EnableWebSecurity @EnableGlobalMethodSec
我正在尝试使用 @WithMockUser 测试来测试我的 CommentController,但似乎找不到用户(因为用户 id (author_id) 为空)或评论内容。我不确定测试是否以正确的方式
我正在使用: request.IsUserInRole("ADMIN") 在我的 Controller 之一中确定对请求的响应。我尝试在测试中模拟请求,例如: @Mock private HttpSe
我将 Spring Boot 用于我的 Web 应用程序并使用 TestNG 进行单元测试。以下是我正在尝试的单元测试 @ContextConfiguration public class Autho
我刚刚发现了新的 Spring Security 4 测试注释 @WithMockUser,但我无法让它用于我的 Selenium 测试。问题是,这个注解创建了一个模拟的 SecurityContex
我正在使用 Cucumber 测试来测试启用了 Spring Security 的 Spring Boot 应用程序。一切正常,除非我使用 Cucumber 测试运行我的测试套件,一些使用 Sprin
环境:我有一个基于 spring boot 的微服务架构应用程序,由多个基础设施服务和资源服务(包含业务逻辑)组成。授权和身份验证由管理用户实体并为客户端创建 JWT token 的 oAuth2 服
由于我从 1.x 迁移到 Spring Boot 2.0.5,并且无意禁用安全性,因此我无法让测试角色进行模拟 MVC 测试: @RunWith(SpringRunner.class) @Spring
我正在为一个 spring 项目构建一个基于权限的访问控制,它具有分层权限。为此,我将 GrantedAuthority 对象扩展为 Permission。自定义 PermissionVoter 最终
我已经花了整整几天时间试图弄清楚我做错了什么,但不知道为什么它不起作用。首先,我想说的是,以下配置主要是从我正在处理的另一个项目中复制而来的,并且这些项目可以毫无问题地运行(但是它们的配置略有不同,并
我是一名优秀的程序员,十分优秀!