spring - 如何使用 OAuth2 和 Mock 测试资源

标签 spring oauth-2.0 spring-security-oauth2 jhipster

我使用带有 Oauth2 实现的 Jhipster 和 mongodb 作为数据库。 我正在尝试使用 OAuth2 测试资源。但我总是收到错误消息“访问被拒绝”和状态代码 401。我正在寻找带有 OAuth2 的 JUnit 示例。谢谢!

曼努埃尔

 /**
 * Test class for the InvoiceResource REST controller.
 *
 * @see InvoiceResource
 */
@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = Application.class)
@WebAppConfiguration
@IntegrationTest
public class InvoiceResourceIntTest {
...
private MockMvc restInvoiceMockMvcWebApp;

    @PostConstruct
    public void setup() {
       MockitoAnnotations.initMocks(this);
       this.restInvoiceMockMvcWebApp = MockMvcBuilders.webAppContextSetup(context).alwaysDo(MockMvcResultHandlers.print())
        .apply(SecurityMockMvcConfigurers.springSecurity()).build();
    }

    @Before
    public void initTest() {
        // Create currentuser
        currentUser = new User();
        currentUser.setActivated(CURRENTUSER_ACTIVATED);
        currentUser.setFirstName(CURRENTUSER_FIRSTNAME);
        currentUser.setLastName(CURRENTUSER_LASTNAME);
        currentUser.setEmail(CURRENTUSER_EMAIL);

        Set<Authority> authorities = new HashSet<>();
        Authority authority = new Authority();
        authority.setName(AuthoritiesConstants.ADMIN);
        currentUser.setAuthorities(authorities);
        currentUser.setPassword(passwordEncoder.encode(CURRENTUSER_PASSWORD));
        userRepository.save(currentUser);
    }

    @Test
    // @WithMockUser(username = CURRENTUSER_EMAIL, password = CURRENTUSER_PASSWORD, roles = { "ADMIN" })
    public void getAllInvoices() throws Exception {
        // Initialize the database
        invoice.setDeletedAt(LocalDate.now());
        invoiceRepository.save(invoice);

        invoice.setId(null);
        invoice.setDeletedAt(null);
        invoiceRepository.save(invoice);

        // Get all the invoices
        restInvoiceMockMvcWebApp.perform(get("/api/invoicessort=id,desc")
          .with(user(CURRENTUSER_EMAIL).password(CURRENTUSER_PASSWORD.roles("ADMIN")))
          .andExpect(status().isOk()).andExpect(content().contentType(MediaType.APPLICATION_JSON)).andExpect(jsonPath("$", hasSize(1)))
     }

最佳答案

您可以从 token 资源获取 token ,并在测试中使用该 token ,这里是一个完整的示例。

@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = Application.class)
@WebAppConfiguration
public class PermissionTest {

    @Autowired
    WebApplicationContext context;
    @Autowired
    FilterChainProxy springSecurityFilterChain;
    MockMvc mvc;

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

    @Test
    public void shouldHavePermission() throws Exception {
        mvc.perform(get("/api/resource")
                .header("Authorization", "Bearer " + getAccessToken("user", "123"))
                .accept(MediaType.APPLICATION_JSON))
                .andExpect(status().isOk());
    }

    private String getAccessToken(String username, String password) {    
        MockHttpServletResponse response = mvc
                .perform(post("/oauth/token")
                        .header("Authorization", "Basic "
                                + new String(Base64Utils.encode(("appclient:password")
                                .getBytes())))
                        .param("username", username)
                        .param("password", password)
                        .param("grant_type", "password"))
                .andReturn().getResponse();

        return new ObjectMapper()
                .readValue(response.getContentAsByteArray(), OAuthToken.class)
                .accessToken;
    }


    @JsonIgnoreProperties(ignoreUnknown = true)
    private static class OAuthToken {
        @JsonProperty("access_token")
        public String accessToken;
    }
}

关于spring - 如何使用 OAuth2 和 Mock 测试资源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34950565/

相关文章:

java - EHcache 与 Spring Configruation + JdbcTemplate

java - Spring 社交推特停止流媒体操作

java - 每 30 秒执行一次 Java 类的最简单方法是什么?

java - 无法使用 Spring Boot 提供静态 index.html

java - Java fx webview 中的 Google 身份验证

spring - 如何在 spring oauth2 OAuth2AccessToken 请求或如何覆盖 OAuth2AccessTokenSupport restTemplate 变量上设置代理?

spring - 预授权错误处理

spring-boot - Spring Boot Webflux Security - 编写测试时读取服务类中的 Principal

php - Google Analytics 核心报告 API,包含适用于 PHP 的电子邮件和密码

oauth-2.0 - Light-OAuth2 刷新 token 永远存在? (必须明确删除)