Возникли проблемы с введением моего пользователя безопасности Spring в мой контроллер - PullRequest
5 голосов
/ 20 марта 2012

Я использую Spring 3.1.0.RELEASE с Spring Security 3.1.Я хочу внедрить моего пользователя Spring (то есть пользователя, который в данный момент вошел в систему) в контроллер.Я хочу сделать это вместо использования

SecurityContextHolder.getContext().getAuthentication().getPrincipal();

, потому что это позволяет мне легче тестировать контроллер с помощью JUnit.Однако у меня возникла проблема с моей текущей настройкой.Мой вопрос заключается в том, как правильно ввести моего пользователя (по запросу) в мой контроллер?В моем файле контекста приложения у меня есть ...

<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"чтобы получить автосвязь (значение всегда равно нулю).Я ищу лучший способ сделать все это, что можно легко интегрировать в мой тест JUnit.Есть идеи?

Редактировать : Вот тест 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");
}

1 Ответ

10 голосов
/ 21 марта 2012

Вы не можете автоматически связать поля static.Есть некоторые обходные пути, но я не хочу показывать их вам ...

Существует множество способов получить доступ к текущему пользователю в более простом и элегантном виде:

См. также

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...