스프링 보안 3.1에서 스프링 3.1.0.RELEASE를 사용하고 있습니다. Spring 사용자 (즉, 현재 로그인 한 사용자)를 컨트롤러에 삽입하려고합니다. 그것은 나를 JUnit을보다 쉽게 컨트롤러를 테스트 할 수 있기 때문에내 스프링 보안 사용자를 내 컨트롤러에 삽입하는 데 문제가 있습니다.
SecurityContextHolder.getContext().getAuthentication().getPrincipal();
를 사용하는 것이 아니라 나는이 작업을 수행 할 수. 그러나 현재 설정에 문제가 있습니다. 내 질문은 내 컨트롤러에 내 사용자 (요청 당)를 주입하는 올바른 방법은 무엇입니까? 내 응용 프로그램 컨텍스트 파일에서, 나는 ...이
내가 아니라 내 공장 클래스를 정의<bean id="userDetails" class="com.myco.eventmaven.security.SecurityHolder" factory-method="getUserDetails" scope="request">
<aop:scoped-proxy />
</bean>
...
public class SecurityHolder {
@Autowired
private static UserService userService;
public static MyUserDetails getUserDetails() {
final Authentication a = SecurityContextHolder.getContext().getAuthentication();
if (a == null) {
return null;
} else {
final MyUserDetails reg = (MyUserDetails) a.getPrincipal();
final int userId = reg.getId();
final MyUserDetails foundUser = userService.findUserById(userId);
return foundUser;
} // if
} // getUserDetails
}
하지만 "userService는"autowire가 얻을하지 못하기 때문에 팩토리 클래스는 반복적으로 사망 (값은 항상 null입니다). JUnit 테스트에 쉽게 통합 할 수있는 더 좋은 방법을 찾고 있습니다. 어떤 아이디어?
편집 : 여기 내가
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration({ "file:src/test/resources/testApplicationContext.xml" })
public class UserEventFeedsControllerTest extends AbstractTransactionalJUnit4SpringContextTests {
private MockHttpServletRequest request;
private MockHttpServletResponse response;
...
@Autowired
private RequestMappingHandlerAdapter handlerAdapter;
@Autowired
private RequestMappingHandlerMapping handlerMapping;
@Before
public void setUp() {
...
request = new MockHttpServletRequest();
response = new MockHttpServletResponse();
}
...
@Test
public void testSubmitUserEventFeedsForm() throws Exception {
request.setRequestURI("/eventfeeds.jsp");
request.setMethod("POST");
final List<EventFeed> allEventFeeds = getAllEventFeeds();
request.setParameter("userEventFeeds", allEventFeeds.get(0).getId().toString());
final Object handler = handlerMapping.getHandler(request).getHandler();
final ModelAndView mav = handlerAdapter.handle(request, response, handler);
assertViewName(mav, "user/eventfeeds");
}
테스트의 목적을 위해, 어떻게 내가 교장 개체를 삽입 할 Spring4JUnitRunner 클래스를 사용하는 JUnit 테스트에서? Junit 테스트를 어떻게 실행하는지 보여주는 코드 예제를 추가했습니다. – Dave
@Dave : 살펴보기 : http://stackoverflow.com/questions/8990931 –
원본 UserDetails 객체에서 Principal 객체로 우아한 방법을 찾을 수 없어 확장 된 테스트 클래스를 만들어야했습니다. 내 원래 UserDetails 객체와 Principal을 구현했습니다. 귀하의 링크마다 요청 클래스에 테스트 클래스를 삽입 했으므로 좋은 결과를 얻었습니다. – Dave