Вторичен Facebook вход с Spring Social

1. Общ преглед

В този урок ще се съсредоточим върху добавянето на ново влизане във Facebook към съществуващо приложение за влизане във формуляр.

Ще използваме пролетната социална подкрепа, за да взаимодействаме с Facebook и да поддържаме нещата чисти и прости.

2. Конфигурация на Maven

Първо, ще трябва да добавим зависимостта spring-social-facebook към нашия pom.xml :

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

3. Конфигурация на сигурността - просто формуляр за вход

Нека първо започнем от простата конфигурация на защитата, където просто имаме удостоверяване на базата на формуляри:

@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(); } }

Няма да отделяме много време за тази конфигурация - ако искате да я разберете по-добре, погледнете статията за влизане във формуляра.

4. Свойствата на Facebook

След това нека конфигурираме свойствата на Facebook в нашата application.properties :

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

Забележи, че:

  • Трябва да създадем приложение във Facebook, за да получим appId и appSecret
  • От настройките на приложението на Facebook не забравяйте да добавите „Уебсайт“ на платформата и // localhost: 8080 / е „URL адресът на сайта“

5. Конфигурация на сигурността - Добавяне на Facebook

Сега, нека добавим нов начин за удостоверяване в системата - задвижван от 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); } }

Нека разгледаме внимателно новата конфигурация:

  • ние използваме ProviderSignInController, за да активираме удостоверяването на Facebook, което се нуждае от две неща:

    първо, ConnectionFactoryLocator, регистриран като FacebookConnectionFactory с Facebook свойствата, които дефинирахме по-рано.

    второ, InMemoryUsersConnectionRepository .

  • чрез изпращане на POST на “ / signin / facebook ” - този контролер ще инициира потребителски вход с помощта на доставчика на услуги на Facebook
  • настройваме SignInAdapter за обработка на логиката за вход в нашето приложение
  • и ние също така настройваме ConnectionSignUp, за да се справя с неявно регистриране на потребители, когато те за първи път се удостоверяват с Facebook

6. Адаптер за влизане

Просто казано, този адаптер е мост между контролера по-горе - задвижване на потока за влизане на потребителя на Facebook - и нашето специфично локално приложение:

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; } }

Обърнете внимание, че потребителите, влезли с Facebook, ще имат роля FACEBOOK_USER , докато потребителите, влезли с помощта на формуляр, ще имат роля USER.

7. Регистрация за връзка

Когато потребителят се удостовери с Facebook за първи път, той няма съществуващ акаунт в нашето приложение.

Това е точката, в която трябва да създадем този акаунт автоматично за тях; ще използваме ConnectionSignUp, за да управляваме тази логика за създаване на потребители:

@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(); } }

Както можете да видите, ние създадохме акаунт за новия потребител - използвайки неговото DisplayName като потребителско име.

8. Предният край

И накрая, нека да разгледаме нашия преден край.

Сега ще имаме поддръжка за тези два потока за удостоверяване - формуляр за вход и Facebook - на нашата страница за вход:

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

И накрая - ето index.html :

Username

Logout

User authorities

Обърнете внимание как тази индексна страница показва потребителски имена и пълномощия.

И това е - сега имаме два начина за удостоверяване в приложението.

9. Заключение

In this quick article, we learned how to use spring-social-facebook to implement a secondary authentication flow for our application.

And of course, as always, the source code is fully available over on GitHub.