首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Mock @AuthenticationPrincipal参数

Mock @AuthenticationPrincipal参数
EN

Stack Overflow用户
提问于 2018-09-05 16:27:36
回答 1查看 3K关注 0票数 4

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

代码语言:javascript
复制
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实例。

代码语言:javascript
复制
@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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-10-25 13:38:03

为了完成这项工作,我不得不实现了一些变通方法。

创建了在SecurityContext中设置身份验证对象的模拟筛选器。以下是代码

代码语言:javascript
复制
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();
  }
}

在测试中

代码语言:javascript
复制
@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))...
  }
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52180555

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档