Log Masuk Borang Keselamatan Spring

1. Pengenalan

Artikel ini akan memberi tumpuan kepada Login dengan Spring Security . Kami akan membina contoh Spring MVC sebelumnya yang sederhana, kerana itu adalah bahagian penting untuk menyiapkan aplikasi web bersama dengan mekanisme log masuk.

2. Pergantungan Maven

Semasa bekerja dengan Spring Boot, spring-boot-starter-security starter secara automatik akan merangkumi semua pergantungan seperti spring-security-core , spring-security-web dan spring-security-config antara lain:

 org.springframework.boot spring-boot-starter-security 2.3.3.RELEASE 

Sekiranya kami tidak menggunakan Spring Boot, lihat artikel Spring Security with Maven, yang menerangkan cara menambahkan semua pergantungan yang diperlukan. Kedua-dua keselamatan-web- standard dan spring-security-config akan diperlukan.

3. Konfigurasi Java Security Spring

Mari mulakan dengan membuat kelas konfigurasi Spring Security yang meluaskan WebSecurityConfigurerAdapter.

Dengan menambahkan @EnableWebSecurity , kami mendapat sokongan integrasi Spring Security dan MVC:

@Configuration @EnableWebSecurity public class SecSecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(final AuthenticationManagerBuilder auth) throws Exception { // authentication manager (see below) } @Override protected void configure(final HttpSecurity http) throws Exception { // http builder configurations for authorize requests and form login (see below) } }

Dalam contoh ini, kami telah menggunakan pengesahan dalam memori dan menentukan 3 pengguna.

Seterusnya, kita membahas elemen yang telah kita gunakan untuk membuat konfigurasi login borang.

Mari bina Pengurus Pengesahan kami terlebih dahulu.

3.1. Pengurus Pengesahan

Penyedia Pengesahan disokong oleh pelaksanaan dalam memori yang mudah - InMemoryUserDetailsManager secara khusus. Ini berguna untuk prototaip pantas apabila mekanisme ketekunan penuh belum diperlukan:

protected void configure(final AuthenticationManagerBuilder auth) throws Exception { auth.inMemoryAuthentication() .withUser("user1").password(passwordEncoder().encode("user1Pass")).roles("USER") .and() .withUser("user2").password(passwordEncoder().encode("user2Pass")).roles("USER") .and() .withUser("admin").password(passwordEncoder().encode("adminPass")).roles("ADMIN"); }

Di sini, kami mengkonfigurasi tiga pengguna dengan nama pengguna, kata laluan, dan peranan dengan kod keras.

Bermula dengan Spring 5, kita juga harus menentukan pengekod kata laluan . Dalam contoh kami, kami telah menggunakan BCryptPasswordEncoder:

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

Seterusnya, mari kita konfigurasikan HttpSecurity.

3.2. Konfigurasi untuk Mengizinkan Permintaan

Kami mulakan dengan melakukan konfigurasi yang diperlukan untuk Mengizinkan Permintaan.

Di sini, kami membenarkan akses / log masuk tanpa nama sehingga pengguna dapat mengesahkan. Menyekat / admin untuk ADMIN peranan dan mendapatkan segala-galanya:

@Override protected void configure(final HttpSecurity http) throws Exception { http .csrf().disable() .authorizeRequests() .antMatchers("/admin/**").hasRole("ADMIN") .antMatchers("/anonymous*").anonymous() .antMatchers("/login*").permitAll() .anyRequest().authenticated() .and() // ... }

Perhatikan bahawa susunan elemen antMatchers () penting - peraturan yang lebih spesifik perlu didahulukan, diikuti dengan yang lebih umum .

3.3. Konfigurasi untuk Log Masuk Borang

Seterusnya, kami memperluas konfigurasi di atas untuk log masuk dan log keluar borang:

@Override protected void configure(final HttpSecurity http) throws Exception { http // ... .and() .formLogin() .loginPage("/login.html") .loginProcessingUrl("/perform_login") .defaultSuccessUrl("/homepage.html", true) .failureUrl("/login.html?error=true") .failureHandler(authenticationFailureHandler()) .and() .logout() .logoutUrl("/perform_logout") .deleteCookies("JSESSIONID") .logoutSuccessHandler(logoutSuccessHandler()); }
  • loginPage () - halaman log masuk tersuai
  • loginProcessingUrl () - URL untuk menghantar nama pengguna dan kata laluan
  • defaultSuccessUrl () - halaman arahan setelah berjaya masuk
  • FailUrl () - halaman arahan setelah log masuk tidak berjaya
  • logoutUrl () - logout tersuai

4. Tambahkan Spring Security ke Aplikasi Web

Untuk menggunakan konfigurasi Spring Security yang dinyatakan di atas, kita perlu melampirkannya ke aplikasi web.

Kami akan menggunakan WebApplicationInitializer , jadi kami tidak perlu menyediakan web.xml:

public class AppInitializer implements WebApplicationInitializer { @Override public void onStartup(ServletContext sc) { AnnotationConfigWebApplicationContext root = new AnnotationConfigWebApplicationContext(); root.register(SecSecurityConfig.class); sc.addListener(new ContextLoaderListener(root)); sc.addFilter("securityFilter", new DelegatingFilterProxy("springSecurityFilterChain")) .addMappingForUrlPatterns(null, false, "/*"); } }

Perhatikan bahawa inisialisasi ini tidak diperlukan jika kita menggunakan aplikasi Spring Boot. Lihat artikel kami mengenai konfigurasi automatik keselamatan Spring Boot untuk maklumat lebih lanjut mengenai bagaimana konfigurasi keselamatan dimuat di Spring Boot.

5. Konfigurasi Spring Security XML

Mari kita lihat juga konfigurasi XML yang sesuai.

Keseluruhan proyek menggunakan konfigurasi Java, jadi kita perlu mengimport file konfigurasi XML melalui kelas Java @Configuration :

@Configuration @ImportResource({ "classpath:webSecurityConfig.xml" }) public class SecSecurityConfig { public SecSecurityConfig() { super(); } }

Dan Konfigurasi XML Keselamatan Musim Semi - webSecurityConfig.xml :

6. Laman web.xml

Sebelum pengenalan Spring 4 , kami biasa mengkonfigurasi konfigurasi Spring Security di web.xml - hanya penapis tambahan yang ditambahkan ke web.xml Spring MVC standard :

Spring Secured Application     springSecurityFilterChain org.springframework.web.filter.DelegatingFilterProxy   springSecurityFilterChain /* 

Penapis - DelegatingFilterProxy - hanya mendelegasikan kepada kacang yang diuruskan oleh musim bunga - FilterChainProxy - yang dengan sendirinya dapat memanfaatkan pengurusan kitaran hidup kacang musim bunga penuh dan sebagainya.

7. Borang Log Masuk

Halaman borang log masuk akan didaftarkan dengan Spring MVC menggunakan mekanisme mudah untuk memetakan nama pandangan ke URL tanpa memerlukan pengawal eksplisit di antara:

registry.addViewController("/login.html");

This, of course, corresponds to the login.jsp:


    
User:
Password:

The Spring Login form has the following relevant artifacts:

  • login – the URL where the form is POSTed to trigger the authentication process
  • username – the username
  • password – the password

8. Further Configuring Spring Login

We briefly discussed a few configurations of the login mechanism when we introduced the Spring Security Configuration above – let's go into some detail now.

One reason to override most of the defaults in Spring Security is to hide the fact that the application is secured with Spring Security and minimize the information a potential attacker knows about the application.

Fully configured, the login element looks like this:

@Override protected void configure(HttpSecurity http) throws Exception { http.formLogin() .loginPage("/login.html") .loginProcessingUrl("/perform_login") .defaultSuccessUrl("/homepage.html",true) .failureUrl("/login.html?error=true") }

Or the corresponding XML configuration:

8.1. The Login Page

Next, let's see how we can configure a custom login page using the loginPage() method:

http.formLogin() .loginPage("/login.html")

Or, via XML configuration:

login-page='/login.html'

If we don't specify this, Spring Security will generate a very basic Login Form at the /login URL.

8.2. The POST URL for Login

The default URL where the Spring Login will POST to trigger the authentication process is /login which used to be /j_spring_security_check before Spring Security 4.

We can use the loginProcessingUrl method to override this URL:

http.formLogin() .loginProcessingUrl("/perform_login")

Or, via XML configuration:

login-processing-url="/perform_login"

A good reason to override this default URL is to hide the fact that the application is actually secured with Spring Security – that information should not be available externally.

8.3. The Landing Page on Success

After a successful login process, the user is redirected to a page – which by default is the root of the web application.

We can override this via the defaultSuccessUrl() method:

http.formLogin() .defaultSuccessUrl("/homepage.html")

Or with XML configuration:

default-target-url="/homepage.html"

In case the always-use-default-target is set to true, then the user is always redirected to this page. If that attribute is set to false, then the user will be redirected to the previous page they wanted to visit before being prompted to authenticate.

8.4. The Landing Page on Failure

Same as with the Login Page, the Login Failure Page is autogenerated by Spring Security at /login?error by default.

To override this, we can use the failureUrl() method:

http.formLogin() .failureUrl("/login.html?error=true")

Or with XML:

authentication-failure-url="/login.html?error=true"

9. Conclusion

Dalam Contoh Log Masuk Musim Semi ini , kami mengkonfigurasi proses pengesahan yang mudah - kami membincangkan Borang Masuk Keselamatan Musim Semi, Konfigurasi Keselamatan, dan beberapa penyesuaian yang lebih maju yang tersedia.

Pelaksanaan tutorial Spring Login ini boleh didapati di projek GitHub - ini adalah projek berasaskan Eclipse, jadi mudah untuk diimport dan dijalankan sebagaimana adanya.

Apabila projek dijalankan secara tempatan, HTML sampel dapat diakses di:

//localhost:8080/spring-security-mvc-login/login.html