Log Masuk Facebook Sekunder dengan Spring Social

1. Gambaran keseluruhan

Dalam tutorial ini, kita akan fokus untuk menambahkan log masuk Facebook baru ke aplikasi log masuk borang yang ada.

Kami akan menggunakan sokongan Sosial Musim Semi untuk berinteraksi dengan Facebook dan menjaga kebersihan dan kesederhanaan.

2. Konfigurasi Maven

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

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

3. Security Config - Hanya Log Masuk Borang

Mari kita mulakan dari konfigurasi keselamatan yang mudah di mana kita hanya mempunyai pengesahan berasaskan borang:

@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 masa untuk konfigurasi ini - jika anda ingin memahaminya dengan lebih baik, lihat artikel log masuk borang.

4. Hartanah Facebook

Seterusnya, mari kita konfigurasikan sifat Facebook dalam aplikasi kita .

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

Perhatikan bahawa:

  • Kita perlu membuat aplikasi Facebook untuk mendapatkan appId dan appSecret
  • Dari Tetapan aplikasi Facebook, pastikan untuk Menambah Platform "Laman Web" dan // localhost: 8080 / adalah "URL Laman"

5. Security Config - Menambah Facebook

Sekarang, mari kita tambahkan cara baru untuk mengesahkan 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 teliti konfigurasi baru:

  • kami menggunakan ProviderSignInController untuk mengaktifkan pengesahan Facebook, yang memerlukan dua perkara:

    pertama, ConnectionFactoryLocator didaftarkan sebagai FacebookConnectionFactory dengan sifat Facebook yang kami tentukan sebelumnya.

    kedua, InMemoryUsersConnectionRepository .

  • dengan menghantar POST ke " / signin / facebook " - pengawal ini akan memulakan login pengguna menggunakan penyedia perkhidmatan Facebook
  • kami menyediakan SignInAdapter untuk menangani logik log masuk dalam aplikasi kami
  • dan kami juga menyediakan ConnectionSignUp untuk menangani pendaftaran pengguna secara tidak langsung ketika mereka mengesahkan pertama kali dengan Facebook

6. Penyesuai Log Masuk

Ringkasnya, penyesuai ini adalah jambatan antara pengawal di atas - mendorong aliran masuk pengguna Facebook - dan aplikasi tempatan 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 bahawa pengguna yang log masuk menggunakan Facebook akan mempunyai peranan FACEBOOK_USER , sementara pengguna yang log masuk menggunakan borang akan memiliki peranan USER.

7. Daftar Masuk

Apabila pengguna mengesahkan dengan Facebook untuk pertama kalinya, mereka tidak mempunyai akaun yang ada dalam aplikasi kami.

Ini adalah titik di mana kita perlu membuat akaun itu secara automatik untuk mereka; kita akan menggunakan ConnectionSignUp untuk mendorong logik penciptaan 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 akaun untuk pengguna baru - menggunakan DisplayName mereka sebagai nama pengguna.

8. Bahagian Depan

Akhir sekali, mari kita lihat bahagian depan kita.

Kami sekarang akan mendapat sokongan untuk dua aliran pengesahan ini - borang masuk dan Facebook - di halaman log masuk kami:

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

Akhirnya - inilah index.html :

Username

Logout

User authorities

Perhatikan bagaimana halaman indeks ini menampilkan nama pengguna dan pihak berkuasa.

Dan itu sahaja - kami kini mempunyai dua cara untuk mengesahkan ke dalam aplikasi.

9. Kesimpulannya

Dalam artikel ringkas ini, kami belajar bagaimana menggunakan spring-social-facebook untuk melaksanakan aliran pengesahan sekunder untuk aplikasi kami.

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