5

作爲Spring 3 MVC的一部分,可以將當前登錄的用戶(Principle)對象注入控制器方法。Spring 3 MVC Controller集成測試 - 將Principal注入方法

E.g.

@Controller 
public class MyController { 

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

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

這被記錄爲春季3文檔這裏的一部分: http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/mvc.html#mvc-ann-requestmapping-arguments

這適用於生產代碼。但是我不知道如何測試這個。 當我創建集成測試(也設置了彈簧安全上下文) 並調用控制器句柄方法時,Principal始終爲空!

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 

} 

測試運行正常,除Principal之外的所有內容都爲空。

任何想法?

TIA

阿尤布

回答

10

後快速查看春天來源這應該工作:

request.setUserPrincipal(somePrincipal); 
+0

我試過這個,它工作。很簡單,整齊。謝謝 –

1

我打電話使用Spring Security的代碼之前,做在我的測試是這樣的(如主要參數解析您正在測試):

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

我tr ied前段時間這樣做,這是我用來設置身份驗證的方法。

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方法中調用它。 希望它有幫助。

+0

嗨我試過上面的例子,這是我以前的嘗試類似。 –

+0

哎呀,我的意思是我嘗試了以上,它似乎沒有工作。謝謝 –