Перейти к основному содержимому

Вторичный вход в Facebook с помощью Spring Social

· 4 мин. чтения

1. Обзор

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

Мы собираемся использовать поддержку Spring Social для взаимодействия с Facebook и сохранения чистоты и простоты.

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

Во- первых, нам нужно добавить зависимость spring-social-facebook к нашему pom.xml :

<dependency>
<groupId>org.springframework.social</groupId>
<artifactId>spring-social-facebook</artifactId>
<version>2.0.3.RELEASE</version>
</dependency>

3. Конфигурация безопасности — просто войдите в форму

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

@Configuration
@EnableWebSecurity
@ComponentScan(basePackages = { "com.foreach.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 убедитесь, что добавлена платформа «Веб-сайт», а 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);
}
}

Внимательно посмотрим на новый конфиг:

  • мы используем 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 — на нашей странице входа:

<html>
<body>
<div th:if="${param.logout}">You have been logged out</div>
<div th:if="${param.error}">There was an error, please try again</div>

<form th:action="@{/login}" method="POST" >
<input type="text" name="username" />
<input type="password" name="password" />
<input type="submit" value="Login" />
</form>

<form action="/signin/facebook" method="POST">
<input type="hidden" name="scope" value="public_profile" />
<input type="submit" value="Login using Facebook"/>
</form>
</body>
</html>

Наконец – вот index.html :

<html>
<body>
<nav>
<p sec:authentication="name">Username</p>
<a th:href="@{/logout}">Logout</a>
</nav>

<h1>Welcome, <span sec:authentication="name">Username</span></h1>
<p sec:authentication="authorities">User authorities</p>
</body>
</html>

Обратите внимание, как на этой индексной странице отображаются имена пользователей и полномочия.

Вот и все — теперь у нас есть два способа аутентификации в приложении.

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

В этой быстрой статье мы узнали, как использовать spring-social-facebook для реализации вторичного потока аутентификации для нашего приложения.

И, конечно же, как всегда, исходный код полностью доступен на GitHub .