Выбор между формой входа и OAuth2 с помощью Spring Security - PullRequest
0 голосов
/ 27 апреля 2020

Я хочу реализовать простое приложение, которое позволяет пользователям войти в систему с локальной учетной записью или зарегистрировать новую учетную запись или войти с помощью OAuth2 - например, Facebook. Для пользователей, которые выбрали Facebook, я хотел бы автоматически создать локальную учетную запись и войти в нее с этой учетной записью.

Насколько я понимаю, Spring Social - это dead (было бы очень полезно, если бы это было упомянуто на главной странице проекта, потому что это спасло бы усилия для таких людей, как я, которые инвестировали в изучение весеннего социального общения).

Другая вещь, которую я понимаю, заключается в том, что " OAuth2 и OID C теперь являются первоклассными гражданами в экосистемах Spring Boot и Spring Security ». Похоже, что правильный путь к go - это использование Spring Security 5 с его первоклассной поддержкой OAuth2!

Итак ... давайте go. My application.yaml:

spring:
  security:
    oauth2:
      client:
        registration:
          facebook:
            client-id: senko
            client-secret: topsecret

Конфигурация безопасности:

  @Override
  protected void configure(HttpSecurity http) throws Exception {

    // for the ant pattern matcher syntax, please check:
    // https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/util/AntPathMatcher.html

    http
        .formLogin()
          .loginPage("/login")
          .loginProcessingUrl("/login/authenticate")
          .failureUrl("/login?param.error=bad_credentials")
          .successForwardUrl("/home")
        .and()
          .logout()
          .logoutUrl("/logout")
          .deleteCookies("JSESSIONID").
        and()
          .authorizeRequests()
          .antMatchers("/login**").permitAll()
          .antMatchers("/**").authenticated().
        and().
          oauth2Login().
          loginPage("/login");
  }

  @Override
  public void configureGlobal(AuthenticationManagerBuilder auth)
    throws Exception {
      auth.userDetailsService(userDetailsService).passwordEncoder(
      new BCryptPasswordEncoder());
  }

Моя служба пользователя использует локальное хранилище с поддержкой MySQL. Краткая форма входа в систему (тимилеф):

Login:

<form id="signin" th:action="@{/login/authenticate}" method="post">
      <input id="login" name="username" type="text" size="25"></input>
      <input id="password" name="password" type="password" size="25"></input>
      <button type="submit">Login In</button>
</form>

Or...:
<a th:href="@{/oauth2/authorization/facebook}">Sign in with Facebook</a>

Пока я могу войти с локальной учетной записью. Я также могу войти через Facebook. Здесь мне не хватает той части, где я должен создать учетную запись локального пользователя после успешного входа в Facebook. Как правильно это реализовать? Я совершенно невежественен. То, что я пробовал до сих пор, это поиск в Google и прочитать код OAuth2LoginAuthenticationProvider. Будем благодарны за любую помощь.

ОБНОВЛЕНИЕ: я изучаю, является ли реализация AuthenticationSuccessHandler правильным вариантом ...

...