Sembra che il dardo segua sempre questi reindirizzamenti nel browser e non ho la possibilità di recuperare il cookie o il token nell'intestazione della prima richiesta.
Quindi, come soluzione alternativa che sto cercando di fare questo prossimo:
Attiva autenticazione di base in materia di sicurezza primavera:
@Configuration
@EnableWebMvcSecurity
@EnableGlobalMethodSecurity(securedEnabled = true, prePostEnabled = true)
@Order(SecurityProperties.ACCESS_OVERRIDE_ORDER)
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/", "/logout").permitAll()
.anyRequest().authenticated()
.and()
.httpBasic()
.and()
.sessionManagement().sessionFixation().changeSessionId()
.and()
.csrf().disable();
}
...
}
In un controller Ho qualcosa di simile come una risorsa protetta:
@RequestMapping(value = "login", method = RequestMethod.POST)
public String login() {
return RequestContextHolder.currentRequestAttributes().getSessionId();
}
In questo modo è possibile ottenere l'id della sessione come risultato regolare. Quindi posso semplicemente recuperare l'ID dal corpo della risposta e usarlo dopo aver fornito le credenziali di autenticazione di base corrette una volta.
Questo dovrebbe essere utilizzato solo in ambienti fidati o tramite https per rendere più difficile per i malintenzionati annusare le credenziali o la sessione.
Quindi, in pratica questo è quello che faccio il login:
void login() {
Map<String, String> headers = {};
authorize(headers);
HttpRequest.request(LOGIN_URL, method: "POST", requestHeaders: headers)
.then((request) => processLogin(request))
.catchError((e) => processLoginError(e));
}
void processLogin(HttpRequest request) {
sessionController.sessionId=request.responseText;
mainApp.showHome();
}
void processLoginError(var e) {
print("total failure to login because of $e");
}
String authorization() {
String auth = window.btoa("$username:$password");
return "Basic $auth";
}
void authorize(Map<String, String> headers) {
headers.putIfAbsent("Authorization",() => authorization());
}
Per inviare le richieste con HeaderHttpSessionStrategy
posso fare questo:
void updateUserData(){
_logger.info("Updating user data");
Map<String, String> headers = {"Accept": "application/json", 'x-auth-token':sessionId};
HttpRequest.request(USER_URL, method: "GET", requestHeaders: headers)
.then((request) => processUserData(request))
.catchError(ErrorHandler.handleHttpErrorGeneric);
}
Si potrebbe anche farlo funzionare con i biscotti, ma Mi piace il HttpRequest.request()
quindi era più facile andare con i campi di intestazione.
C'è stata una discussione di recente che potrebbe essere correlato https://groups.google.com/a/dartlang.org/forum/?nomobile= vero #! topic/cloud/OPFK_0MkB3c –
L'ho visto, ma sembra usare il dardo: io che non è disponibile nel browser :-( –
Sembra che sia molto più semplice scrivere il mio filtro di accesso che semplicemente non reindirizza : - / –