Spring Security Basic-Authentifizierung

Basisauthentifizierung von Spring Security

1. Überblick

Dieses Tutorial zeigt, wie SieBasic Authentication with Spring einrichten, konfigurieren und anpassen. Wir werden auf den einfachenSpring MVC example aufbauen und die Benutzeroberfläche der MVC-Anwendung mit dem von Spring Security bereitgestellten Basic Auth-Mechanismus sichern.

2. Die Spring-Sicherheitskonfiguration

Wir können Spring Security mit Java config konfigurieren:

@Configuration
@EnableWebSecurity
public class CustomWebSecurityConfigurerAdapter extends WebSecurityConfigurerAdapter {

    @Autowired
    private MyBasicAuthenticationEntryPoint authenticationEntryPoint;

    @Autowired
    public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
        auth.inMemoryAuthentication()
          .withUser("user1").password(passwordEncoder().encode("user1Pass"))
          .authorities("ROLE_USER");
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests()
          .antMatchers("/securityNone").permitAll()
          .anyRequest().authenticated()
          .and()
          .httpBasic()
          .authenticationEntryPoint(authenticationEntryPoint);

        http.addFilterAfter(new CustomFilter(),
          BasicAuthenticationFilter.class);
    }

    @Bean
    public PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }
}

Hier verwenden wir das ElementhttpBasic(), um die Basisauthentifizierung innerhalb derconfigure()-Methode einer Klasse zu definieren, dieWebSecurityConfigurerAdapter. erweitert

Dasselbe könnte auch mit XML erreicht werden:



    
    



    
        
            
        
    

Was hier relevant ist, ist das<http-basic>-Element innerhalb des Haupt<http>-Elements der Konfiguration - dies reicht aus, um die Standardauthentifizierung für die gesamte Anwendung zu aktivieren. Der Authentifizierungsmanager steht nicht im Mittelpunkt dieses Lernprogramms. Daher verwenden wir einen In-Memory-Manager, bei dem Benutzer und Kennwort im Klartext definiert sind.

Dieweb.xml der Webanwendung, die Spring Security aktiviert, wurden bereits inSpring Logout tutorial erläutert.

3. Konsumieren der gesicherten Anwendung

Der Befehlcurl ist unser Werkzeug zum Konsumieren der gesicherten Anwendung.

Versuchen wir zunächst,/homepage.htmlanzufordern, ohne Sicherheitsanmeldeinformationen anzugeben:

curl -i http://localhost:8080/spring-security-rest-basic-auth/api/foos/1

Wir erhalten die erwarteten401 Unauthorized undthe Authentication Challenge zurück:

HTTP/1.1 401 Unauthorized
Server: Apache-Coyote/1.1
Set-Cookie: JSESSIONID=E5A8D3C16B65A0A007CFAACAEEE6916B; Path=/spring-security-mvc-basic-auth/; HttpOnly
WWW-Authenticate: Basic realm="Spring Security Application"
Content-Type: text/html;charset=utf-8
Content-Length: 1061
Date: Wed, 29 May 2013 15:14:08 GMT

Der Browser würde diese Herausforderung interpretieren und uns in einem einfachen Dialogfeld zur Eingabe von Anmeldeinformationen auffordern. Da wir jedochcurlverwenden, ist dies nicht der Fall.

Fordern wir jetzt dieselbe Ressource an - die Homepage - aberprovide the credentials, um ebenfalls darauf zuzugreifen:

curl -i --user user1:user1Pass
  http://localhost:8080/spring-security-rest-basic-auth/api/foos/1

Jetzt lautet die Antwort vom Server200 OK zusammen mitCookie:

HTTP/1.1 200 OK
Server: Apache-Coyote/1.1
Set-Cookie: JSESSIONID=301225C7AE7C74B0892887389996785D; Path=/spring-security-mvc-basic-auth/; HttpOnly
Content-Type: text/html;charset=ISO-8859-1
Content-Language: en-US
Content-Length: 90
Date: Wed, 29 May 2013 15:19:38 GMT

Über den Browser kann die Anwendung normal verwendet werden. Der einzige Unterschied besteht darin, dass eine Anmeldeseite nicht mehr erforderlich ist, da alle Browser die Standardauthentifizierung unterstützen und den Benutzer in einem Dialogfeld zur Eingabe von Anmeldeinformationen auffordern.

4. Weitere Konfiguration - Der Einstiegspunkt

Standardmäßig gibt der von Spring Security bereitgestellteBasicAuthenticationEntryPointeine vollständige Seite für die Antwort von401 Unauthorizedan den Client zurück. Diese HTML-Darstellung des Fehlers wird in einem Browser gut wiedergegeben, eignet sich jedoch nicht für andere Szenarien, z. B. eine REST-API, bei der eine json-Darstellung bevorzugt werden kann.

Der Namespace ist auch für diese neue Anforderung flexibel genug - um dies zu beheben, kann der Einstiegspunkt überschrieben werden:

Der neue Einstiegspunkt ist als Standard-Bean definiert:

@Component
public class MyBasicAuthenticationEntryPoint extends BasicAuthenticationEntryPoint {

    @Override
    public void commence(
      HttpServletRequest request, HttpServletResponse response, AuthenticationException authEx)
      throws IOException, ServletException {
        response.addHeader("WWW-Authenticate", "Basic realm="" + getRealmName() + """);
        response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
        PrintWriter writer = response.getWriter();
        writer.println("HTTP Status 401 - " + authEx.getMessage());
    }

    @Override
    public void afterPropertiesSet() throws Exception {
        setRealmName("example");
        super.afterPropertiesSet();
    }
}

Indem wir direkt in die HTTP-Antwort schreiben, haben wir jetzt die volle Kontrolle über das Format des Antwortkörpers.

5. Die Maven-Abhängigkeiten

Die Maven-Abhängigkeiten für Spring Security wurden bereits inSpring Security with Maven article erläutert. Zur Laufzeit sind sowohlspring-security-web als auchspring-security-config verfügbar.

6. Fazit

In diesem Beispiel haben wir eine MVC-Anwendung mit Spring Security und Basic Authentication gesichert. Wir haben die XML-Konfiguration besprochen und die Anwendung mit einfachen Curl-Befehlen belegt. Schließlich übernahm er die Kontrolle über das genaue Fehlermeldungsformat - von der Standard-HTML-Fehlerseite zu einem benutzerdefinierten Text- oder JSON-Format.

Die vollständige Implementierung dieses Tutorials finden Sie inthe GitHub project - dies ist ein Maven-basiertes Projekt, daher sollte es einfach zu importieren und auszuführen sein.

Wenn das Projekt lokal ausgeführt wird, kann auf das Beispiel-HTML zugegriffen werden unter: