Log Masuk Tunggal Sederhana dengan Spring Security OAuth2 (tumpukan lama)

1. Gambaran keseluruhan

Dalam tutorial ini, kita akan membincangkan cara melaksanakan SSO - Single Sign On - menggunakan Spring Security OAuth dan Spring Boot.

Kami akan menggunakan tiga aplikasi berasingan:

  • Pelayan Pengesahan - yang merupakan mekanisme pengesahan pusat
  • Dua Aplikasi Pelanggan: aplikasi menggunakan SSO

Secara sederhana, apabila pengguna cuba mengakses halaman yang diamankan dalam aplikasi klien, mereka akan diarahkan untuk mengesahkan terlebih dahulu, melalui Pelayan Pengesahan.

Dan kami akan menggunakan jenis pemberian Kod Pengesahan dari OAuth2 untuk mendorong pengesahan pengesahan.

Catatan : artikel ini menggunakan projek legasi Spring OAuth. Untuk versi artikel ini menggunakan timbunan Spring Security 5 yang baru, lihat artikel kami Simple Single Sign-On dengan Spring Security OAuth2.

2. Aplikasi Pelanggan

Mari mulakan dengan Permohonan Pelanggan kami; tentunya kami akan menggunakan Spring Boot untuk meminimumkan konfigurasi:

2.1. Ketergantungan Maven

Pertama, kita memerlukan kebergantungan berikut dalam pom.xml kami :

 org.springframework.boot spring-boot-starter-web   org.springframework.boot spring-boot-starter-security   org.springframework.security.oauth.boot spring-security-oauth2-autoconfigure 2.0.1.RELEASE   org.springframework.boot spring-boot-starter-thymeleaf   org.thymeleaf.extras thymeleaf-extras-springsecurity4 

2.2. Konfigurasi Keselamatan

Seterusnya, bahagian yang paling penting, konfigurasi keselamatan aplikasi pelanggan kami:

@Configuration @EnableOAuth2Sso public class UiSecurityConfig extends WebSecurityConfigurerAdapter { @Override public void configure(HttpSecurity http) throws Exception { http.antMatcher("/**") .authorizeRequests() .antMatchers("/", "/login**") .permitAll() .anyRequest() .authenticated(); } }

Bahagian inti dari konfigurasi ini, tentu saja, anotasi @ EnableOAuth2Sso yang kami gunakan untuk mengaktifkan Single Sign On.

Perhatikan bahawa kita perlu memperluas WebSecurityConfigurerAdapter - tanpanya, semua jalan akan diamankan - sehingga pengguna akan diarahkan untuk log masuk ketika mereka mencoba mengakses halaman mana pun. Dalam kes kami di sini, halaman indeks dan log masuk adalah satu-satunya halaman yang boleh diakses tanpa pengesahan.

Akhirnya, kami juga menentukan kacang RequestContextListener untuk menangani skop permintaan.

Dan aplikasi.yml :

server: port: 8082 servlet: context-path: /ui session: cookie: name: UISESSION security: basic: enabled: false oauth2: client: clientId: SampleClientId clientSecret: secret accessTokenUri: //localhost:8081/auth/oauth/token userAuthorizationUri: //localhost:8081/auth/oauth/authorize resource: userInfoUri: //localhost:8081/auth/user/me spring: thymeleaf: cache: false

Beberapa nota ringkas:

  • kami melumpuhkan Pengesahan Asas lalai
  • accessTokenUri adalah URI untuk mendapatkan Token Akses
  • userAuthorizationUri adalah URI kebenaran yang akan dialihkan pengguna
  • userInfoUri URI titik akhir pengguna untuk mendapatkan maklumat pengguna semasa

Perhatikan juga bahawa, dalam contoh kami di sini, kami melancarkan Pelayan Pengesahan kami, tetapi tentu saja kami juga dapat menggunakan penyedia pihak ketiga yang lain seperti Facebook atau GitHub.

2.3. Bahagian Depan

Sekarang, mari kita lihat konfigurasi depan aplikasi pelanggan kami. Kami tidak akan memfokuskan perkara itu di sini, terutamanya kerana kami sudah membuat liputan di laman web ini.

Permohonan pelanggan kami di sini mempunyai front-end yang sangat sederhana; berikut adalah index.html :

 Login

Dan SecuredPage.html :

 Welcome, Name

The securedPage.html halaman diperlukan pengguna untuk disahkan. Sekiranya pengguna yang tidak disahkan disahkan cuba mengakses securedPage.html , mereka akan diarahkan ke halaman log masuk terlebih dahulu.

3. Pelayan Auth

Sekarang mari kita bincangkan Pelayan Pengesahan kami di sini.

3.1. Ketergantungan Maven

Pertama, kita perlu menentukan kebergantungan dalam pom.xml kita :

 org.springframework.boot spring-boot-starter-web   org.springframework.security.oauth spring-security-oauth2 2.3.3.RELEASE 

3.2. Konfigurasi OAuth

Penting untuk difahami bahawa kita akan menjalankan Server Pengesahan dan Pelayan Sumber bersama di sini, sebagai satu unit yang dapat digunakan.

Mari mulakan dengan konfigurasi Pelayan Sumber kami - yang berfungsi sebagai aplikasi Boot utama kami:

@SpringBootApplication @EnableResourceServer public class AuthorizationServerApplication extends SpringBootServletInitializer { public static void main(String[] args) { SpringApplication.run(AuthorizationServerApplication.class, args); } }

Kemudian, kami akan mengkonfigurasi pelayan Pengesahan kami:

@Configuration @EnableAuthorizationServer public class AuthServerConfig extends AuthorizationServerConfigurerAdapter { @Autowired private BCryptPasswordEncoder passwordEncoder; @Override public void configure( AuthorizationServerSecurityConfigurer oauthServer) throws Exception { oauthServer.tokenKeyAccess("permitAll()") .checkTokenAccess("isAuthenticated()"); } @Override public void configure(ClientDetailsServiceConfigurer clients) throws Exception { clients.inMemory() .withClient("SampleClientId") .secret(passwordEncoder.encode("secret")) .authorizedGrantTypes("authorization_code") .scopes("user_info") .autoApprove(true) .redirectUris( "//localhost:8082/ui/login","//localhost:8083/ui2/login"); } }

Perhatikan bagaimana kita hanya membolehkan pelanggan mudah menggunakan authorization_code jenis geran.

Juga, perhatikan bagaimana autoApprove disetel ke true sehingga kami tidak diarahkan dan dipromosikan untuk secara manual menyetujui sebarang ruang lingkup.

3.3. Konfigurasi Keselamatan

Pertama, kami akan mematikan Pengesahan Asas lalai, melalui aplikasi kami .

server.port=8081 server.servlet.context-path=/auth

Sekarang, mari beralih ke konfigurasi dan tentukan mekanisme log masuk borang mudah:

@Configuration @Order(1) public class SecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { http.requestMatchers() .antMatchers("/login", "/oauth/authorize") .and() .authorizeRequests() .anyRequest().authenticated() .and() .formLogin().permitAll(); } @Override protected void configure(AuthenticationManagerBuilder auth) throws Exception { auth.inMemoryAuthentication() .withUser("john") .password(passwordEncoder().encode("123")) .roles("USER"); } @Bean public BCryptPasswordEncoder passwordEncoder(){ return new BCryptPasswordEncoder(); } }

Perhatikan bahawa kami menggunakan pengesahan dalam memori yang mudah, tetapi kami boleh menggantinya dengan penggunaDetailsService .

3.4. Titik Akhir Pengguna

Akhirnya, kami akan membuat titik akhir pengguna yang kami gunakan sebelumnya dalam konfigurasi kami:

@RestController public class UserController { @GetMapping("/user/me") public Principal user(Principal principal) { return principal; } }

Secara semula jadi, ini akan mengembalikan data pengguna dengan representasi JSON.

4. Kesimpulan

Dalam tutorial ringkas ini, kami memberi tumpuan untuk melaksanakan Single Sign-On menggunakan Spring Security Oauth2 dan Spring Boot.

Seperti biasa, kod sumber penuh boleh didapati di GitHub.