Ложный аргумент @AuthenticationPrincipal - PullRequest
0 голосов
/ 05 сентября 2018

У меня есть приложение spring-security-oauth2, которое является ResourceServer. У нас есть пользовательский класс PrincipalExtractor, который создает пользовательский объект Principal. Этот пользовательский объект Principal не распространяется на Principal или UserDetails

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

1 Ответ

0 голосов
/ 25 октября 2018

Мне пришлось применить обходной путь, чтобы получить эту работу.

Создан фиктивный фильтр, который устанавливает объект аутентификации в SecurityContext. Ниже приведен код

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))...
  }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...