2016-07-24 1 views
2

Ich folge Spring Security and Angular JS für HTTP-Basic-Authentifizierung, durch Hinzufügen Authorization-Header zu $ ​​HTTP-Header nicht vorhanden ist:Spring Security nicht Fehler auslösen, wenn Autorisierungsheader nach dem Login mit AngularJS

const headers = { 
    authorization: "Basic " + btoa(this.login + ":" + this.password) 
}; 

this._$http.get("user", 
    { 
     headers: headers, 
    }) 
    .then(
     this.showUser.bind(this), 
     this.showError.bind(this) 
    ); 

Innen showUser ich umleiten zu jobs Komponente mit $location:

this._$location.path("jobs"); 

Und innerhalb jobs Komponente, lade ich zur Verfügung stehenden Arbeitsplätze:

public $onInit() { 
    this._$http.get("jobs").then(function(response) { 
     this.jobs = response.data; 
    }.bind(this)); 
    this.authenticated = this._loginService.isLogged(); 
} 

Absichtlich ohne Autorisierung Header, zu beweisen, dass alles funktioniert. Ich dachte, es sollte durch Spring Security mit HTTP 401 Unauthorized oder so etwas aufgegeben werden, aber es funktionierte ohne Autorisierung Header. Wenn ich mich aus einem anderen Browserfenster abmelde und Jobs neu lade, ist es in Ordnung, Jobs werden nicht geladen. Aber ich denke (und ich hoffe) Autorisierungsdaten (HTTP Basic) sollten in jeder Anfrage vorhanden sein. Hier ist meine Sicherheitskonfiguration:

protected void configure(HttpSecurity http) throws Exception { 
    http 
     .formLogin() 
     .successHandler(
      new DifferentRoleBasedStartingURLsAuthenticationSuccessHandler() 
     ) 
     .and() 
     .logout() 
     .logoutUrl("/logout") 
     .and() 
     .httpBasic() 
     .and() 
     .authorizeRequests() 
     .antMatchers("/jobs/**").authenticated() 
     .antMatchers("/interviews/**").authenticated() 
     .anyRequest().permitAll() 
     .and() 
     .csrf() 
     .csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse()) 
    ; 

Vielleicht habe ich hier einen Fehler gemacht. Ich denke, Regel .antMatchers("/jobs/**").authenticated() sollte jobs/ auch authentifiziert werden. Kannst du mir helfen? Vielen Dank im Voraus.


UPDATE 2016.07.31: Vielleicht mit kantiger Genehmigung Header werden nicht bei jeder Anfrage im Frühjahr benötigt? Mein Repo ist hier: Playground for Spring and Angular (AngularJS branch), Passwort ist test für jeden erstellten Benutzer.

+0

Warum gibt es ein Formular Login, wenn Sie http Standardauthentifizierung zu verwenden sind versuchen? Beachten Sie auch, dass die Formularanmeldung im Frühjahr auf Cookies basiert. Vielleicht erhalten Sie deshalb nicht die Ergebnisse, die Sie erwarten. Ihr authorizeRequests() -Abschnitt ist korrekt. Das Tutorial, auf das Sie verweisen, konfiguriert auch nicht das Formular-Login, daher bin ich mir nicht sicher, warum es da ist. – Pieter

+0

@Pieter, wenn ich es entferne, wird es funktionieren? Entschuldigung, dass ich frage, ich kann es jetzt nicht überprüfen. –

Antwort

3

Wenn Sie die Standardauthentifizierung verwenden, macht es nicht viel Sinn, die Formularanmeldung auch im Frühjahr zu konfigurieren. Bei Verwendung der Standardauthentifizierung muss der HTTP-Autorisierungsheader für jede Anforderung vorhanden sein, die eine Authentifizierung auf dem Server erfordert. Wenn für eine geschützte Ressource kein Autorisierungsheader vorhanden ist, gibt Spring eine 401-Antwort zurück.

Ihre Einrichtung sieht für mich korrekt aus (und ja, "/ jobs/**" stimmt mit "/ jobs" überein), aber Ihr Versuch, die Sicherheitseinschränkungen zu überprüfen, ist fehlgeschlagen, da der Server auch ein jsessionid-Cookie setzt das kann verwendet werden, um dich zu authentifizieren. Wenn Sie also eine geschützte Ressource ohne Autorisierungsheader aber mit einem gültigen jsessionid-Cookie anfordern, kann der Server Sie weiterhin authentifizieren.

Sie können Spring-Security mitteilen, nicht mit der HTTP-Sitzung zu interagieren, indem Sie die Sitzungserstellungsrichtlinie auf STATELESS setzen.

die folgende Sicherheitskonfiguration Versuchen:

protected void configure(HttpSecurity http) throws Exception { 
    http.httpBasic() 
      .and() 
      .authorizeRequests() 
      .antMatchers("/jobs/**").authenticated() 
      .antMatchers("/interviews/**").authenticated() 
      .anyRequest().permitAll() 
      .and() 
      .csrf() 
      .csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse()) 
      .and() 
      .sessionManagement() 
      .sessionCreationPolicy(SessionCreationPolicy.STATELESS) 
      .and(); 
} 
+1

Ich habe die vorherige Reihenfolge der Matcher umgekehrt ('ant .... ant .... anyRequest(). permitAll()'), setze 'sessionCreationPolicy' auf' SessionCreationPolicy.NEVER' (ist das was du meinst in Code? Du hast 'IMMER' geschrieben und es hat funktioniert - vielen Dank! –

+0

in der Tat, SessionCreationPolicy.ALWAYS im Beispielcode ist nicht das, was ich schreiben wollte :) Ich habe das Code-Snippet aktualisiert. – Pieter

+0

Ich habe das Beispiel aktualisiert, sodass SessionCreationPolicy.STATELESS anstelle von SessionCreationPolicy.NEVER verwendet wird. Mit der NEVER-Policy interagiert Spring immer noch mit der http-Session, falls eine existiert. Siehe http://docs.spring.io/autorepo/docs/spring-security/4.1.3.RELEASE/apidocs/index.html?org/springframework/security/config/http/SessionCreationPolicy.html – Pieter

0

Es ist aufgrund der Reihenfolge, die Sie die Sicherheit konfiguriert haben, Spring Security wendet die Regeln in der Reihenfolge an, in der sie erteilt wurde, dh Sie haben zunächst das Muster eingeschränkt und dann erneut mit .anyRequest().permitAll() geöffnet. Ich habe die Bestellung im folgenden Code festgelegt.

+0

Ich habe die Reihenfolge geändert in 'anyRequest(). PermitAll(). AntMatchers ("/jobs/** "). Authentifiziert(). AntMatchers ("/interviews/** "). Authentifiziert()', und ich bin verwirrt - Es benötigt immer noch nicht HTTP Basic. Alles in allem - vielleicht, mit Spring Security und Angular, braucht es keine Autorisierungsdaten bei jeder Anfrage, z. B. nur mit der ersten und dann Spring merkt sie? Ich bin definitiv kein Experte, aber vielleicht sind 'Cookie: JSESSIONID .....' und 'X-XSRF-TOKEN' genug? Ich bin wirklich verwirrt in der Art und Weise, wie es funktioniert. Mein Repo ist hier: [Spielplatz für Frühling und Angular] (https://github.com/radek-anuszewski/hire-platform) –

+0

Richtiger Zweig: [Spielplatz für Frühling und Angular (AngularJS Zweig)] (https: // github .com/radek-anuszewski/hire-platform/tree/Angular_JS) –

+0

Erbaut mehrere Angular Spring Security und es funktioniert perfekt. Ich werde mir Ihren Code ansehen und Sie wissen lassen. – KubenT

Verwandte Themen