Probleme beim Einspritzen meine Spring security user in meinem controller
Ich bin mit Spring 3.1.0.RELEASE mit Spring Security 3.1. Ich will Spritzen mein Frühling Benutzer (d.h. der Benutzer, der aktuell angemeldet ist) in einen controller. Ich möchte dies tun im Gegensatz zur Verwendung
SecurityContextHolder.getContext().getAuthentication().getPrincipal();
weil es mir erlaubt, den test der Steuergeräte mehr leicht mit JUnit. Aber, ich habe ein problem mit meinem aktuellen setup. Meine Frage ist, was ist der richtige Weg, um zu injizieren, meine Benutzer (pro Anfrage) in meinem controller? In meiner Anwendung Kontext-Datei, ich habe ...
<bean id="userDetails" class="com.myco.eventmaven.security.SecurityHolder" factory-method="getUserDetails" scope="request">
<aop:scoped-proxy />
</bean>
wo definiere ich meine factory-Klasse als ...
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
}
aber die factory-Klasse immer wieder stirbt, weil "userService" nicht autowired (der Wert ist immer null). Ich bin auf der Suche nach einem besseren Weg, um all dies zu tun, kann leicht auch integrieren in mein JUnit-test. Irgendwelche Ideen?
Bearbeiten: Hier ist das JUnit-test-ich freue mich auf die Arbeit mit ...
@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");
}
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie nicht autowire
static
Felder. Es gibt einige workarounds, aber ich will nicht, um Ihnen zu zeigen, um Sie...Gibt es viele Möglichkeiten, um Sie auf aktuelle Benutzer in einfacher und eleganter matter:
Injizieren
Principal
zu Ihrer Steuerung (siehe Bei der Verwendung von Spring Security, was ist der richtige Weg, um den aktuellen Benutzernamen (D. H. SecurityContext -) Informationen in einer bean?):Entwickeln Sie Ihre eigenen Fassade über
SecurityContext
Ersetzen built-in
contextHolderStrategy
imSecurityContextHolder
für die Zwecke der PrüfungSiehe auch