Вторичный Facebook Логин с весенней социальной
1. Обзор
В этом учебнике мы сосредоточимся на добавлении нового входа Facebook в существующее приложение для входа в форму.
Мы будем использовать весеннюю социальную поддержку, чтобы взаимодействовать с Facebook и держать вещи чистыми и простыми.
2. Конфигурация Maven
Во-первых, нам нужно будет добавить весенне-социально-facebook зависимость от нашей пом.xml :
org.springframework.social spring-social-facebook 2.0.3.RELEASE
3. Безопасность Config – Просто форма входа
Давайте сначала начнем с простой конфигурации безопасности, где у нас просто есть проверка подлинности на основе формы:
@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.properts :
spring.social.facebook.appId=YOUR_APP_ID spring.social.facebook.appSecret=YOUR_APP_SECRET
Обратите внимание, что:
- Нам нужно создать приложение Facebook, чтобы получить appId и appSecret
- Из настроек приложения Facebook, убедитесь, что добавить платформу “Веб-сайт” http://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); } }
Давайте внимательно рассмотрим новую конфигу:
- мы используем ПоставщикСинКонтроллер для проверки подлинности 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 , в то время как пользователи вошли в систему с помощью формы будет иметь пользователь.
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 outThere was an error, please try again
Наконец – вот индекс.html :
Welcome, Username
User authorities
Обратите внимание, как на этой странице индекса отображаются имена пользователей и органы власти.
И это все – теперь у нас есть два способа проверки подлинности в приложении.
9. Заключение
В этой быстрой статье мы научились использовать весенне-социально-facebook для реализации вторичного потока аутентификации для нашего приложения.
И, конечно, как всегда, исходный код полностью доступен более на GitHub .