Einführung in Java Config for Spring Security

1. Übersicht

Dieser Artikel ist eine Einführung in die Java-Konfiguration für Spring Security , mit der Benutzer Spring Security ohne Verwendung von XML einfach konfigurieren können .

Die Java-Konfiguration wurde in Spring 3.1 zum Spring-Framework hinzugefügt und in Spring 3.2 zu Spring Security erweitert und ist in einer mit @Configuration kommentierten Klasse definiert .

2. Maven Setup

Um Spring Security in einem Maven-Projekt verwenden zu können, muss zunächst die Spring-Security-Core- Abhängigkeit im Projekt pom.xml vorhanden sein :

 org.springframework.security spring-security-core 5.3.3.RELEASE 

Die neueste Version finden Sie immer hier.

3. Web-Sicherheit mit Java-Konfiguration

Beginnen wir mit einem grundlegenden Beispiel einer Spring Security Java-Konfiguration:

@EnableWebSecurity public class SecurityConfig extends WebSecurityConfigurerAdapter { @Autowired public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception { auth.inMemoryAuthentication().withUser("user") .password(passwordEncoder().encode("password")).roles("USER"); } }

Wie Sie vielleicht bemerkt haben, richtet die Konfiguration eine grundlegende In-Memory-Authentifizierungskonfiguration ein. Zusätzlich benötigen wir ab Frühjahr 5 eine PasswordEncoder- Bean:

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

4. HTTP-Sicherheit

Um die HTTP-Sicherheit im Frühjahr zu aktivieren, müssen Sie den WebSecurityConfigurerAdapter erweitern , um eine Standardkonfiguration in der Methode configure (HttpSecurity http) bereitzustellen :

protected void configure(HttpSecurity http) throws Exception { http.authorizeRequests() .anyRequest().authenticated() .and().httpBasic(); } 

Die obige Standardkonfiguration stellt sicher, dass jede Anforderung an die Anwendung mit formularbasierter Anmeldung oder HTTP-Basisauthentifizierung authentifiziert wird.

Außerdem ähnelt es genau der folgenden XML-Konfiguration:

5. Formular Login

Interessanterweise generiert Spring Security automatisch eine Anmeldeseite, basierend auf den aktivierten Funktionen und unter Verwendung von Standardwerten für die URL, die die übermittelte Anmeldung verarbeitet:

protected void configure(HttpSecurity http) throws Exception { http.authorizeRequests() .anyRequest().authenticated() .and().formLogin() .loginPage("/login").permitAll(); }

Hier ist die automatisch generierte Anmeldeseite praktisch, um schnell einsatzbereit zu sein.

6. Autorisierung mit Rollen

Lassen Sie uns nun eine einfache Autorisierung für jede URL mithilfe von Rollen konfigurieren:

protected void configure(HttpSecurity http) throws Exception { http.authorizeRequests() .antMatchers("/", "/home").access("hasRole('USER')") .antMatchers("/admin/**").hasRole("ADMIN") .and() // some more method calls .formLogin(); }

Beachten Sie, wie wir sowohl die typsichere API - hasRole - als auch die ausdrucksbasierte API über den Zugriff verwenden.

7. Abmelden

Wie bei vielen anderen Aspekten von Spring Security gibt es auch beim Abmelden einige wichtige Standardeinstellungen, die vom Framework bereitgestellt werden.

Standardmäßig macht eine Abmeldeanforderung die Sitzung ungültig, löscht alle Authentifizierungscaches, löscht den SecurityContextHolder und leitet zur Anmeldeseite weiter.

Hier ist eine einfache Abmeldekonfiguration:

protected void configure(HttpSecurity http) throws Exception { http.logout(); }

Wenn Sie jedoch mehr Kontrolle über die verfügbaren Handler erhalten möchten, sieht eine vollständigere Implementierung folgendermaßen aus:

protected void configure(HttpSecurity http) throws Exception { http.logout().logoutUrl("/my/logout") .logoutSuccessUrl("/my/index") .logoutSuccessHandler(logoutSuccessHandler) .invalidateHttpSession(true) .addLogoutHandler(logoutHandler) .deleteCookies(cookieNamesToClear) .and() // some other method calls }

8. Authentifizierung

Schauen wir uns eine andere Möglichkeit an, die Authentifizierung mit Spring Security zuzulassen.

8.1. In-Memory-Authentifizierung

Wir beginnen mit einer einfachen In-Memory-Konfiguration:

@Autowired public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception { auth.inMemoryAuthentication() .withUser("user").password(passwordEncoder().encode("password")).roles("USER") .and() .withUser("admin").password(passwordEncoder().encode("password")).roles("USER", "ADMIN"); } 

8.2. JDBC-Authentifizierung

Um dies auf JDBC zu verschieben, müssen Sie lediglich eine Datenquelle in der Anwendung definieren - und diese direkt verwenden:

@Autowired private DataSource dataSource; @Autowired public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception { auth.jdbcAuthentication().dataSource(dataSource) .withDefaultSchema() .withUser("user").password(passwordEncoder().encode("password")).roles("USER") .and() .withUser("admin").password(passwordEncoder().encode("password")).roles("USER", "ADMIN"); } 

Natürlich müssen wir bei beiden obigen Beispielen auch die PasswordEncoder- Bean definieren , wie in Abschnitt 3 beschrieben.

9. Fazit

In diesem kurzen Tutorial haben wir uns mit den Grundlagen der Java-Konfiguration für Spring Security befasst und uns auf die Codebeispiele konzentriert, die die einfachsten Konfigurationsszenarien veranschaulichen.