首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Spring Security在表单登录和OAuth2登录之间进行选择

使用Spring Security在表单登录和OAuth2登录之间进行选择
EN

Stack Overflow用户
提问于 2020-04-27 22:49:09
回答 1查看 440关注 0票数 1

我想实现一个简单的应用程序,使用户能够登录与一个本地帐户或注册一个新的帐户或登录与OAuth2 -例如脸书。对于选择Facebook的用户,我想自动创建一个本地帐户,并使用该帐户登录。

据我所知,Spring Socialdead (如果在项目的主页上提到这一点会非常有帮助,因为这将为像我这样投资学习spring社交的人节省精力)。

我理解的另一件事是"OAuth2和OIDC现在是Spring Boot和Spring Security生态系统中的一等公民。“似乎正确的方法是使用Spring Security5,它对OAuth2的支持是一流的!

所以..。我们走吧。我的application.yaml

代码语言:javascript
复制
spring:
  security:
    oauth2:
      client:
        registration:
          facebook:
            client-id: senko
            client-secret: topsecret

安全配置:

代码语言:javascript
复制
  @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支持的本地存储。简写为登录表单(胸腺叶):

代码语言:javascript
复制
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后应该创建一个本地用户帐户的部分。实现这一点的正确方法是什么?我完全没头绪。到目前为止,我已经尝试过在谷歌上搜索并阅读OAuth2LoginAuthenticationProvider的代码。任何帮助都将不胜感激。

更新:我正在探索实现一个AuthenticationSuccessHandler是否是一个合适的选择...

EN

回答 1

Stack Overflow用户

发布于 2021-11-03 12:17:47

您可以注册一个自定义bean (OAuth2UserService),它将自动替换默认配置。实际上,下面的示例只是委托来自默认配置的实现,但允许扩展/添加额外的逻辑(在本例中是为了处理用户)。

代码语言:javascript
复制
@Bean
public OAuth2UserService<OAuth2UserRequest, OAuth2User> oauth2UserService() {
    
    DefaultOAuth2UserService service = new DefaultOAuth2UserService();
    return request -> {
        OAuth2User user = service.loadUser(request);
        
        System.out.println("User attributes: " + user.getAttributes()); // can be converted and saved
        
        return user;
    };
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61461608

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档