Ich habe eine Feder-Controller, der auf einem authentifizierten GET aus „/ user“ die folgende JSON zurückgibt:Wie kann man auf ein CSRF-Token in einem Spring-Controller-Unit-Test zugreifen?
{"name":<name>,"token":<csrf-token>}
Ich habe versucht, einen Komponententest für den Controller zu konstruieren, dass das zurückgegebene JSON enthält eine dynamically- überprüfen wird erzeugt CSRF-Token:
@Autowired
private FilterChainProxy springSecurityFilterChain;
private MockMvc mvc;
@Before
public void setUp()
throws Exception
{
...
mvc = standaloneSetup(controller)
.apply(springSecurity(springSecurityFilterChain))
.build();
}
@Test
public void getUser()
throws Exception
{
CsrfRequestPostProcessor csrfPostProcessor = null;
mvc.perform(get("/user").with(user(Const.USER)).with(csrfPostProcessor = csrf()))
.andExpect(status().isOk())
.andExpect(content().json("{\"name\":\"" + Const.NAME + "\",\"token\":\"" + csrfPostProcessor.toString() + "\"}"));
}
Der Test schlägt fehl in dieser Richtung:
Failed tests:
ControllerTest.getUser:74 token
Expected: org.springframework.security.test.web.servlet.reques[email protected]203c20cf
got: 565a95b0-d0bb-4376-a8a0-725a3b16a787
gibt es eine Möglichkeit, dies und ich zu beheben Ist es nicht möglich, einen alternativen Test zu erstellen, der ein dynamisch generiertes CSRF-Token verwendet?
das Generieren eines Tokens ist hier nutzlos, das Token ändert sich jedes Mal mit der neuen Anfrage an den Server. –
Es ist nicht nutzlos. Der Controller gibt das dynamisch generierte Token für andere (nicht Spring-) Dienste während einer Sitzung zurück. Der Komponententest simuliert eine solche Sitzung. – user1408140