我想实现一个简单的应用程序,使用户能够登录与一个本地帐户或注册一个新的帐户或登录与OAuth2 -例如脸书。对于选择Facebook的用户,我想自动创建一个本地帐户,并使用该帐户登录。
据我所知,Spring Social是dead (如果在项目的主页上提到这一点会非常有帮助,因为这将为像我这样投资学习spring社交的人节省精力)。
我理解的另一件事是"OAuth2和OIDC现在是Spring Boot和Spring Security生态系统中的一等公民。“似乎正确的方法是使用Spring Security5,它对OAuth2的支持是一流的!
所以..。我们走吧。我的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后应该创建一个本地用户帐户的部分。实现这一点的正确方法是什么?我完全没头绪。到目前为止,我已经尝试过在谷歌上搜索并阅读OAuth2LoginAuthenticationProvider的代码。任何帮助都将不胜感激。
更新:我正在探索实现一个AuthenticationSuccessHandler是否是一个合适的选择...
发布于 2021-11-03 12:17:47
您可以注册一个自定义bean (OAuth2UserService),它将自动替换默认配置。实际上,下面的示例只是委托来自默认配置的实现,但允许扩展/添加额外的逻辑(在本例中是为了处理用户)。
@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;
};
}https://stackoverflow.com/questions/61461608
复制相似问题