Тест интеграции MVC контроллера Spring 3 - внедрить принципал в метод - PullRequest
6 голосов
/ 24 января 2012

В рамках Spring 3 MVC возможно внедрить объект текущего зарегистрированного пользователя (принцип) в метод контроллера.

* 1003 Е.Г. *

@Controller
public class MyController {

    @RequestMapping(value="/update", method = RequestMethod.POST)
    public String update(ModelMap model, Principal principal) {

       String name = principal.getName();
       ... the rest here
    }
}

Это задокументировано как часть документации Spring 3 здесь: http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/mvc.html#mvc-ann-requestmapping-arguments.

Это работает в производственном коде. Однако я не знаю, как это проверить. Когда я создаю интеграционный тест (также настроив контекст безопасности Spring) и вызовите метод дескриптора контроллера, тогда Принципал всегда будет нулевым!

public class FareTypeControllerIntegrationTest extends SpringTestBase {

@Autowired
private MyController controller;

@Autowired
private AnnotationMethodHandlerAdapter handlerAdapter;

private final MockHttpServletRequest request = new MockHttpServletRequest();
private final MockHttpServletResponse response = new MockHttpServletResponse();

@Test
public void testUpdate() throws Exception {
    request.setRequestURI("/update");
    request.setMethod(HttpMethod.POST.name());
    ... setup rest of request

    ModelAndView mav = handlerAdapter.handle(request, response, controller);

    .. rest of assertions

}

Тесты работают правильно, и все, кроме Принципала, равно нулю.

Есть идеи?

ТИА

Аюб

Ответы [ 3 ]

11 голосов
/ 24 января 2012

После быстрого просмотра источников Spring это должно работать:

request.setUserPrincipal(somePrincipal);
4 голосов
/ 24 января 2012

Я пытался сделать это некоторое время назад, вот метод, который я использовал для настройки аутентификации.

protected void setSecurityContext(String login){
            userDetailsTest = userManager.loadUserByUsername(login);
            TestingAuthenticationToken testingAuthenticationToken = new TestingAuthenticationToken(userDetailsTest, userDetailsTest.getAuthorities());
            SecurityContext securityContext = new SecurityContextImpl();
            securityContext.setAuthentication((Authentication) testingAuthenticationToken);
            SecurityContextHolder.setContext(securityContext);
         } 

Тогда я просто вызываю его в методе @Before теста. Надеюсь, это поможет.

2 голосов
/ 24 января 2012

Я делаю что-то подобное в своих тестах до вызова кода с использованием Spring Security (например, преобразователь параметра Principal, который вы тестируете):

SecurityContextHolder.getContext().setAuthentication(new UsernamePasswordAuthenticationToken("wiseau", "Love is blind"));
...