栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

【Spring Boot】Spring Boot OAuth2 单点登录示例 | 第三方账号登录

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

【Spring Boot】Spring Boot OAuth2 单点登录示例 | 第三方账号登录

文章目录
  • 演示工具版本
  • Maven 依赖项
  • Spring Boot 2.x OAuth2 客户端属性配置
  • 使用 Spring HttpSecurity.oauth2Login()
  • 覆盖 OAuth2 自动配置功能
  • 创建控制器和视图
  • 输出结果
  • 参考文献
  • 源码下载

本页将介绍Spring Boot 2.x OAuth2登录示例。

SpringBoot2.x为OAuth2登录提供了完整的自动配置。

我们只需要在应用程序属性文件中为GitHub、Facebook和Google等OAuth2提供程序配置客户端ID和客户端密钥,就完成了。

Oauth2认证的过程如下:请求一个需要登录的网站A,会提示我们使用第三方网站B的用户登录,我们登录,这时候需要我们授权,就是authorize,授权之后,会得到一个token,我们拿到这个token就可以访问这个网站A了。A网站不关心B网站的用户信息。

我们可以通过重写WebSecurityConfigureAdapter的方法并使用Spring5.0中引入的HttpSecurity.oauth2Login()方法来定制配置。

我们需要为ClientRegistrationRepository创建一个bean来覆盖OAuth2属性值。

在本页中,我们将使用GitHub、Facebook和Google身份验证提供商为OAuth2登录创建一个Spring Boot安全(Security)应用程序。

演示工具版本
  1. Java 11
  2. Spring 5.1.7.RELEASE
  3. Spring Boot 2.1.5.RELEASE
  4. Maven 3.5.2
Maven 依赖项

pom.xml


	org.springframework.boot
	spring-boot-starter-parent
	2.1.5.RELEASE
	


	spring-app
	11


	
		org.springframework.boot
		spring-boot-starter-security
	
	
		org.springframework.boot
		spring-boot-starter-web
	
	
		org.springframework.boot
		spring-boot-starter-thymeleaf
	
	
		org.springframework.security
		spring-security-oauth2-client
		5.1.7.RELEASE
	
	
		org.springframework.security
		spring-security-oauth2-jose
		5.1.7.RELEASE
	
 
Spring Boot 2.x OAuth2 客户端属性配置

要使用Spring Boot 2.x自动配置启用OAuth2登录,只需配置下面给出的最少两个属性就可以了。

spring.security.oauth2.client.registration.[registrationId].client-id 

注册客户端id。

spring.security.oauth2.client.registration.[registrationId].client-secret 

注册客户端密码。

注册ID是google、github、facebook等。要配置所有这些OAuth2提供者,请找到属性文件。

application.properties

spring.security.oauth2.client.registration.github.client-id= github-client-id
spring.security.oauth2.client.registration.github.client-secret= github-client-secret

spring.security.oauth2.client.registration.facebook.client-id= facebook-client-id
spring.security.oauth2.client.registration.facebook.client-secret= facebook-client-secret

spring.security.oauth2.client.registration.google.client-id= google-client-id
spring.security.oauth2.client.registration.google.client-secret= google-client-secret 

查找等效的YML文件。

application.yml

spring:
  security:
    oauth2:
      client:
        registration:
          github:
            client-id: github-client-id
            client-secret: github-client-secret
          facebook:
            client-id: facebook-client-id
            client-secret: facebook-client-secret
          google:
            client-id: google-client-id
            client-secret: google-client-secret 
使用 Spring HttpSecurity.oauth2Login()

HttpSecurity.oauth2Login()方法已在Spring 5.0中引入。

oauth2Login()方法使用OAuth 2.0或OpenID Connect 1.0 Provider配置认证支持。

默认配置会在/login上自动生成一个登录页面。找到使用oauth2Login()方法的代码。

SecurityConfig.java

package com.concretepage;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;

@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {
	@Override
	protected void configure(HttpSecurity http) throws Exception {
		http.authorizeRequests().antMatchers("/", "/login**", "/error**").permitAll()
		        .anyRequest().authenticated()
		        .and().logout().logoutUrl("/logout").logoutSuccessUrl("/")
		        .and().oauth2Login();
	}
} 
覆盖 OAuth2 自动配置功能

为了覆盖OAuth2登录的Spring boot自动配置,我们需要为ClientRegistrationRepository创建一个bean,该bean通过传递ClientRegistration实例列表进行实例化。

ClientRegistration表示客户端向OAuth 2.0或OpenID Connect 1.0提供程序注册。

查找使用GitHub和Google覆盖OAuth2登录的自动配置的示例代码。

SecurityConfig.java

@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {
	@Override
	protected void configure(HttpSecurity http) throws Exception {
		http.authorizeRequests().antMatchers("/", "/login**", "/error**").permitAll()
		        .anyRequest().authenticated()
		        .and().logout().logoutUrl("/logout").logoutSuccessUrl("/")
		        .and().oauth2Login();
	}

	@Bean
	public ClientRegistrationRepository clientRegistrationRepository() {
		List registrations = new ArrayList<>();
		registrations.add(githubClientRegistration());
		registrations.add(googleClientRegistration());
		return new InMemoryClientRegistrationRepository(registrations);
	}

	private ClientRegistration githubClientRegistration() {
		return ClientRegistration.withRegistrationId("github")
                                .clientId("github-client-id")
				.clientSecret("github-client-secret")
				.clientAuthenticationMethod(ClientAuthenticationMethod.BASIC)
				.authorizationGrantType(AuthorizationGrantType.AUTHORIZATION_CODE)
				.redirectUriTemplate("{baseUrl}/login/oauth2/code/{registrationId}")
				.authorizationUri("https://github.com/login/oauth/authorize")
				.tokenUri("https://github.com/login/oauth/access_token")
                                .userInfoUri("https://api.github.com/user")
				.clientName("GitHub").build();
	}

	private ClientRegistration googleClientRegistration() {
		return ClientRegistration.withRegistrationId("google")
                                .clientId("google-client-id")
				.clientSecret("google-client-secret")
                                .clientAuthenticationMethod(ClientAuthenticationMethod.BASIC)
				.authorizationGrantType(AuthorizationGrantType.AUTHORIZATION_CODE)
				.redirectUriTemplate("{baseUrl}/login/oauth2/code/{registrationId}")
				.scope("openid", "profile", "email", "address", "phone")
				.authorizationUri("https://accounts.google.com/o/oauth2/v2/auth")
				.tokenUri("https://www.googleapis.com/oauth2/v4/token")
				.userInfoUri("https://www.googleapis.com/oauth2/v3/userinfo")
				.userNameAttributeName(IdTokenClaimNames.SUB)
                                .jwkSetUri("https://www.googleapis.com/oauth2/v3/certs")
				.clientName("Google").build();
	}
} 
创建控制器和视图

AppController.java

package com.concretepage;
import java.security.Principal;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.servlet.ModelAndView;

@Controller
public class AppController {
	@GetMapping("hello")
	public ModelAndView welcome(Principal principal) {
		ModelAndView mav = new ModelAndView();
		mav.setViewName("welcome");
		mav.addObject("name", principal.getName());
		return mav;
	}
} 

index.html




  Spring Security


Go to Dashboard Login with GitHub

Login with Facebook

Login with Google

welcome.html




    Welcome


   Welcome  [[${name}]]  

error.html




  Spring Security


  An error occurred.

 

Main.java

package com.concretepage;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class Main {
	public static void main(String[] args) {
		SpringApplication.run(Main.class, args);
	}
} 
输出结果

下载项目并在application.properties文件中输入google、github、facebook的client-id和client-secret。

然后用命令提示符从项目的根文件夹运行以下命令。

mvn spring-boot:run 

访问网址。

http://localhost:8080/ 

浏览器展示页面

参考文献

【1】OAuth 2.0 Login
【2】Spring Doc: HttpSecurity
【3】Spring Boot OAuth2 Login Example

源码下载

提取码:mao4
spring-boot-oauth2-login.zip

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/322120.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号