Login Facebook Sekunder dengan Spring Social

1. Ikhtisar

Dalam tutorial ini, kita akan fokus menambahkan login Facebook baru ke aplikasi form-login yang sudah ada.

Kami akan menggunakan dukungan Sosial Musim Semi untuk berinteraksi dengan Facebook dan menjaga semuanya tetap bersih dan sederhana.

2. Konfigurasi Maven

Pertama, kita perlu menambahkan dependensi spring-social-facebook ke pom.xml kita :

 org.springframework.social spring-social-facebook 2.0.3.RELEASE 

3. Konfigurasi Keamanan - Hanya dengan Formulir Login

Pertama-tama, mari kita mulai dari konfigurasi keamanan sederhana di mana kita baru saja memiliki otentikasi berbasis formulir:

@Configuration @EnableWebSecurity @ComponentScan(basePackages = { "com.baeldung.security" }) public class SecurityConfig extends WebSecurityConfigurerAdapter { @Autowired private UserDetailsService userDetailsService; @Override protected void configure(AuthenticationManagerBuilder auth) throws Exception { auth.userDetailsService(userDetailsService); } @Override protected void configure(HttpSecurity http) throws Exception { http .csrf().disable() .authorizeRequests() .antMatchers("/login*").permitAll() .anyRequest().authenticated() .and() .formLogin().loginPage("/login").permitAll(); } }

Kami tidak akan menghabiskan banyak waktu untuk konfigurasi ini - jika Anda ingin memahaminya dengan lebih baik, lihat artikel formulir login.

4. Properti Facebook

Selanjutnya, mari konfigurasikan properti Facebook di application.properties kita :

spring.social.facebook.appId=YOUR_APP_ID spring.social.facebook.appSecret=YOUR_APP_SECRET

Perhatikan bahwa:

  • Kita perlu membuat aplikasi Facebook untuk mendapatkan appId dan appSecret
  • Dari Pengaturan aplikasi Facebook, pastikan untuk Menambahkan "Situs Web" Platform dan // localhost: 8080 / adalah "URL Situs"

5. Konfigurasi Keamanan - Menambahkan Facebook

Sekarang, mari tambahkan cara baru untuk mengautentikasi ke dalam sistem - didorong oleh Facebook:

public class SecurityConfig extends WebSecurityConfigurerAdapter { @Autowired private FacebookConnectionSignup facebookConnectionSignup; @Value("${spring.social.facebook.appSecret}") String appSecret; @Value("${spring.social.facebook.appId}") String appId; @Override protected void configure(HttpSecurity http) throws Exception { http .authorizeRequests() .antMatchers("/login*","/signin/**","/signup/**").permitAll() ... } @Bean public ProviderSignInController providerSignInController() { ConnectionFactoryLocator connectionFactoryLocator = connectionFactoryLocator(); UsersConnectionRepository usersConnectionRepository = getUsersConnectionRepository(connectionFactoryLocator); ((InMemoryUsersConnectionRepository) usersConnectionRepository) .setConnectionSignUp(facebookConnectionSignup); return new ProviderSignInController(connectionFactoryLocator, usersConnectionRepository, new FacebookSignInAdapter()); } private ConnectionFactoryLocator connectionFactoryLocator() { ConnectionFactoryRegistry registry = new ConnectionFactoryRegistry(); registry.addConnectionFactory(new FacebookConnectionFactory(appId, appSecret)); return registry; } private UsersConnectionRepository getUsersConnectionRepository(ConnectionFactoryLocator connectionFactoryLocator) { return new InMemoryUsersConnectionRepository(connectionFactoryLocator); } }

Mari kita lihat dengan cermat konfigurasi baru:

  • kami menggunakan ProviderSignInController untuk mengaktifkan autentikasi Facebook, yang membutuhkan dua hal:

    pertama, ConnectionFactoryLocator terdaftar sebagai FacebookConnectionFactory dengan properti Facebook yang kita tentukan sebelumnya.

    kedua, InMemoryUsersConnectionRepository .

  • dengan mengirimkan POST ke " / signin / facebook " - pengontrol ini akan memulai pengguna masuk menggunakan penyedia layanan Facebook
  • kami sedang menyiapkan SignInAdapter untuk menangani logika login di aplikasi kami
  • dan kami juga menyiapkan ConnectionSignUp untuk menangani pengguna yang mendaftar secara implisit saat mereka pertama kali mengautentikasi dengan Facebook

6. Adaptor Masuk

Sederhananya, adaptor ini adalah jembatan antara pengontrol di atas - yang mendorong alur masuk pengguna Facebook - dan aplikasi lokal khusus kami:

public class FacebookSignInAdapter implements SignInAdapter { @Override public String signIn( String localUserId, Connection connection, NativeWebRequest request) { SecurityContextHolder.getContext().setAuthentication( new UsernamePasswordAuthenticationToken( connection.getDisplayName(), null, Arrays.asList(new SimpleGrantedAuthority("FACEBOOK_USER")))); return null; } }

Perhatikan bahwa pengguna yang masuk menggunakan Facebook akan memiliki peran FACEBOOK_USER , sedangkan pengguna yang masuk menggunakan formulir akan memiliki peran PENGGUNA.

7. Mendaftar Koneksi

Saat pengguna mengautentikasi dengan Facebook untuk pertama kalinya, mereka tidak memiliki akun di aplikasi kami.

Ini adalah titik di mana kita perlu membuat akun itu secara otomatis untuk mereka; kita akan menggunakan ConnectionSignUp untuk menjalankan logika pembuatan pengguna itu:

@Service public class FacebookConnectionSignup implements ConnectionSignUp { @Autowired private UserRepository userRepository; @Override public String execute(Connection connection) { User user = new User(); user.setUsername(connection.getDisplayName()); user.setPassword(randomAlphabetic(8)); userRepository.save(user); return user.getUsername(); } }

Seperti yang Anda lihat, kami membuat akun untuk pengguna baru - menggunakan DisplayName mereka sebagai nama pengguna.

8. Bagian Depan

Terakhir, mari kita lihat bagian depan kita.

Kami sekarang akan memiliki dukungan untuk dua aliran otentikasi ini - form login dan Facebook - di halaman login kami:

 You have been logged out There was an error, please try again 

Terakhir - inilah index.html :

Username

Logout

User authorities

Perhatikan bagaimana halaman indeks ini menampilkan nama pengguna dan otoritas.

Dan hanya itu - kami sekarang memiliki dua cara untuk mengautentikasi ke dalam aplikasi.

9. Kesimpulan

Dalam artikel singkat ini, kita belajar bagaimana menggunakan spring-social-facebook untuk mengimplementasikan alur otentikasi sekunder untuk aplikasi kita.

Dan tentu saja, seperti biasa, kode sumber tersedia sepenuhnya di GitHub.