【问题标题】:How to bypass the Spring @PreAuthorize annotation on RestController for tests?如何绕过 RestController 上的 Spring @PreAuthorize 注释进行测试?
【发布时间】:2018-06-11 15:39:16
【问题描述】:

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

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

【问题讨论】:

标签: spring spring-boot spring-security pcfdev


【解决方案1】:

您可以使用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>

假设你的控制器看起来像:

@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());

  }

【讨论】:

    【解决方案2】:

    您可以在代码中拥有一个测试配置文件,然后在针对代码运行测试时激活该配置文件。然后,您可以在测试中使用预定义的用户和密码。

    @Configuration
    public class TestConfig {
    
      @EnableWebSecurity
      @Profile("test")
      class WebSecurityConfig extends WebSecurityConfigurerAdapter {
    
        @Bean
        public UserDetailsService userDetailsService() {
          InMemoryUserDetailsManager manager = new InMemoryUserDetailsManager();
          manager.createUser(User.withUsername("user").password("password").roles("ROLE1", "ROLE2", "ROLE3").build());
          return manager;
        }
      }
    }
    

    【讨论】:

      猜你喜欢
      • 2017-06-24
      • 2013-10-13
      • 2021-11-11
      • 2014-04-27
      • 2011-07-21
      • 2013-03-10
      • 2019-11-21
      • 2016-07-18
      • 2020-10-08
      相关资源
      最近更新 更多