spring - 如何绕过 RestController 上的 Spring @PreAuthorize 注解进行测试?

标签 spring spring-boot spring-security pcfdev

我如何创建绕过 @Preauthorize 以便我可以在本地测试而不调用实际,因为注释将在类加载之前加载?

@RestController
@RequestMapping("/test")
public class ResourceController {
    @RequestMapping(method = GET)
    @PreAuthorize
    @ResponseBody
    public String message(){ return "Hello World"; }

最佳答案

您可以使用 spring-security-test 来实现这一点。

pom.xml

<dependency>
      <groupId>org.springframework.security</groupId>
      <artifactId>spring-security-test</artifactId>
      <version>5.3.3.RELEASE</version>
      <scope>test</scope>
    </dependency>

假设你的 Controller 看起来像:

@PreAuthorize("hasRole('ROLE_ADMIN')")
  public User createUser(final User user) {
    ......
  }

你的测试看起来像:

public class MyControllerTests {

  private MockMvc mvc;
  
  @BeforeEach
  void setup() {
    
    mvc = MockMvcBuilders
        .webAppContextSetup(context)
        .apply(springSecurity())
        .build();
  }

  @Test
  void testCreateWithProperPermission() throws Exception {
    
    final User user = new User();
    user.setName("Test");

    final MvcResult mvcResult = mvc.perform(MockMvcRequestBuilders.post("/v1/foo/").with(user("foo").roles("ADMIN"))
        .content(new ObjectMapper().writeValueAsString(user))
        .contentType(MediaType.APPLICATION_JSON))
        .andExpect(status().isOk())
        
    final String responseBody = mvcResult.getResponse().getContentAsString();

    final User created = new ObjectMapper().readValue(responseBody, User.class);

    // verify the saved entity's data is correct
    assertThat(created).isNotNull();
    assertThat(created)
        .hasFieldOrPropertyWithValue("name", user.getName());

  }

关于spring - 如何绕过 RestController 上的 Spring @PreAuthorize 注解进行测试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50801456/

相关文章:

java - 如何在 Spring 批处理作业的下一步中获取上一步执行的 ID?

java - 通过不同的操作实现重用 Spring Webflow 定义

java - 使用 hibernate 命名查询和 spring 填充 DTO 的 List 属性

java - 如何将 Azure App Service 证书与 Java Spring 一起使用以启用 SSL

spring-boot - 无法从 KeyCloak 获取访问 token

spring-boot - 如何解决h2数据库和spring boot中错误的用户名和密码错误?

java - 如何使用 Spring Security 修复对资源的访问?

java - @ControllerAdvice 不允许显示 Swagger UI

java - Spring Web Flow - 处理并发访问

javascript - Spring CSRF 多部分不工作