【问题标题】:Mock @AuthenticationPrincipal argument模拟 @AuthenticationPrincipal 参数
【发布时间】:2019-02-10 07:53:58
【问题描述】:

我有 spring-security-oauth2 应用程序,它是一个 ResourceServer。我们有一个自定义的 PrincipalExtractor 类来构建自定义的 Principal 对象。此自定义 Principal 对象不扩展 PrincipalUserDetails

class CustomUser{
//some custom fields
}

class CustomPrincipalExtractor implements PrincipalExtractor{
  @Override 
  public CustomUser extractPrincipal(Map<String, Object> map){
    return new CustomUser(map);
  }
}


class SomeController{
  @GetMapping
  public ResponseEntity(@AuthenticationPrincipal CustomUser user){
     //able to get user object 
  }
}

上面的代码工作正常。现在我想测试控制器,但无法传递 CustomUser 实例。

@SpringBootTest
@AutoConfigureMockMvc
public class SomeControllerTest{
   @Autowired
   private MockMvc mockMvc;

  @Test
  public void test(){
    mockMvc.perform(get(...).principal(CANNOT pass CustomUser as it does not implement Principal))
  }
}

我查看了其他一些要求自定义 HandlerMethodArgumentResolver 的解决方案,但不确定如何配置自动配置的 MockMvc

【问题讨论】:

    标签: java spring spring-boot spring-security spring-security-oauth2


    【解决方案1】:

    我必须实施一些解决方法才能完成这项工作。

    创建了一个在 SecurityContext 中设置 Authentication 对象的模拟过滤器。以下是代码

    public class MockSpringSecurityFilter implements Filter {
      @Override
      public void init(FilterConfig filterConfig) {}
    
      @Override
      public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
        SecurityContextHolder.getContext()
          .setAuthentication((Authentication) ((HttpServletRequest) req).getUserPrincipal());
        chain.doFilter(req, res);
      }
    
      @Override
      public void destroy() {
        SecurityContextHolder.clearContext();
      }
    }
    

    在测试中

    @Before
    public void setup() {
      mockMvc = MockMvcBuilders.webAppContextSetup(context)
        .apply(springSecurity(new MockSpringSecurityFilter()))
        .build();
    }
    
    @Test
      public void test(){
        mockMvc.perform(get(...)
         .principal(new UsernamePasswordAuthenticationToken(new CustomUser(), null))...
      }
    

    【讨论】:

    • springSecurity()的定义是什么?
    • Found it - org.springframework.security.test.web.servlet.setup.SecurityMockMvcConfigurers#springSecurity()
    猜你喜欢
    • 1970-01-01
    • 2021-05-14
    • 2022-09-28
    • 2015-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-10
    相关资源
    最近更新 更多