2015-02-01 18 views
5

Sto scrivendo una piccola app con un backend basato sul supporto dello stivale a molla e un frontend basato su dardo polimerico.riceve il sessionid dopo l'accesso tramite la sicurezza di primavera

Attualmente sto lottando per ricevere l'id di sessione dal meccanismo di login ...

Inizialmente ho pensato di utilizzare la HeaderHttpSessionStrategy e utilizzare questo per autenticare contro il/Redis negozio sessione primaverile-sessione per consentire scala orizzontale .

Il problema è che la sicurezza di primavera esegue sempre un reindirizzamento dopo l'accesso e in dardo la classe HttpRequest (dal pacchetto html) e dopo il reindirizzamento del campo di intestazione dalla risposta iniziale è ovviamente non più presente/accessibile. Ho provato a disabilitare followRedirect per il client, ma sembra che questo sia disponibile solo per il pacchetto IO HttpRequest.

Poi ho provato a passare a CookieHttpSessionStrategy ma sembra che il dardo HttpRequest non memorizza cookie ricevuti nel backend browser biscotto: -/

Questo dovrebbe essere un problema semplice, ma io sono un po 'perso Qui. Questo non può essere così difficile ...

Quando uso ad esempio i IntelliJ resto cliente tutto funziona e posso estrarre l'id di sessione sia dal biscotto o il campo di intestazione ...

Tutte le idee? : -/

+0

C'è stata una discussione di recente che potrebbe essere correlato https://groups.google.com/a/dartlang.org/forum/?nomobile= vero #! topic/cloud/OPFK_0MkB3c –

+0

L'ho visto, ma sembra usare il dardo: io che non è disponibile nel browser :-( –

+0

Sembra che sia molto più semplice scrivere il mio filtro di accesso che semplicemente non reindirizza : - / –

risposta

2

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.

0

Questo tutorial insegna come impedire a Spring Security di reindirizzare dopo l'autenticazione riuscita o fallita.

autenticazione dovrebbe ritorno 200 Invece di 301
autenticazione riuscita deve restituire 401 invece di 302

realtà, ritengo il codice nel tutorial è finito complicato. Per MySavedRequestAwareAuthenticationSuccessHandler di classe, è sufficiente una sola riga nella funzione onAuthenticationSuccess:

clearAuthenticationAttributes(request); 
Problemi correlati