Java Spring MVC 集成测试创建 OAuth2 主体

标签 java spring-mvc spring-security principal spring-oauth2

我一直在尝试为我们的 Spring MVC 应用程序编写集成测试。我们使用 oAuth2 进行身份验证。

在这种情况下,Spring 为我们提供了一个 Principal 实例,我们用它来确定必须将哪些实体发送回客户端。在我们的 Controller 中,我们有一个端点:

@RequestMapping("/bookings")
public @ResponseBody ResponseEntity<List<ThirdPartyBooking>> getBookings(Principal principal) {
    OAuth2Authentication auth = (OAuth2Authentication) principal;
    OAuth2AuthenticationDetails authDetails = (OAuthAuthenticationDetails) auth.getDetails();
    // Extract stuff from the details...
}

现在,在我们的测试中,我想确保我们只为经过身份验证的用户发送预订。下面是测试代码:

@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = {ThirdPartyBookingServiceConfiguration.class})
@WebAppConfiguration
@Component
public abstract class RepositoryTestBase {
    @Resource
    private WebApplicationContext context;
    private MockMvc mockMvc;

    @Before
    public void setUp() {
        mockMvc = MockMvcBuilders.webAppContextSetup(context).build();
    }

    @Test
    public void shouldOnlyReturnUserBookings() throws Exception {
        MockHttpServletResponse result = mockMvc.perform(MockMvcRequestBuilders.get("/bookings").principal(???)).andReturn().getResponse();
        // Validate the response
    }
}

如何在 ??? 处插入 OAuth2Authentication

最佳答案

我使用RequestPostProcessor进行测试身份验证。只需添加 stub token 到请求即可:

@Component
public class OAuthHelper {

    @Autowired
    AuthorizationServerTokenServices tokenservice;

    public RequestPostProcessor addBearerToken(final String username, String... authorities)
    {
        return mockRequest -> {
            OAuth2Request oauth2Request = new OAuth2Request( null, "client-id",
                        null, true, null, null, null, null, null );
            Authentication userauth = new TestingAuthenticationToken( username, null, authorities);
            OAuth2Authentication oauth2auth = new OAuth2Authentication(oauth2Request, userauth);
            OAuth2AccessToken token = tokenservice.createAccessToken(oauth2auth);

            mockRequest.addHeader("Authorization", "Bearer " + token.getValue());
            return mockRequest;
        };
    }
}

并在测试中使用它:

accessToken = authHelper.addBearerToken( TEST_USER, TEST_ROLE );
    mockMvc.perform( get( "/cats" ).with( accessToken ) )

关于Java Spring MVC 集成测试创建 OAuth2 主体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38326028/

相关文章:

java - 如何从内部具有监听器的 Jersey REST api 方法返回响应

java - 获取事件源而不是编写它

java - 尝试测试 2 个 JSON 框架的性能 - 它看起来正确吗?

java - Spring Security 使用模型属性来应用角色

java - 如何在 SOAP 头中添加签名安全信息

security - Grails + Acegi : How to handle password renewal ? 登录与未登录用户

java - 声明 String 和将其声明为 final 有什么区别?

spring - 在@WebMvcTest 中指定@SpringBootApplication

java - Spring MVC @PropertySource 所有键/值作为映射

java - Spring Security 无法使用 Nginx 服务器创建 SESSION