素材巴巴 > 程序开发 >

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

程序开发 2023-09-04 08:04:39

文章目录

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

SpringBoot2.xOAuth2登录提供了完整的自动配置。

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

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

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

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

在本页中,我们将使用GitHubFacebookGoogle身份验证提供商为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.bootspring-boot-starter-parent2.1.5.RELEASE
 
 spring-app11
 
 org.springframework.bootspring-boot-starter-securityorg.springframework.bootspring-boot-starter-weborg.springframework.bootspring-boot-starter-thymeleaforg.springframework.securityspring-security-oauth2-client5.1.7.RELEASEorg.springframework.securityspring-security-oauth2-jose5.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 
 

注册客户端密码。

注册IDgooglegithubfacebook等。要配置所有这些OAuth2提供者,请找到属性文件。

application.properties

spring.security.oauth2.client.registration.github.client-id= github-client-id
 spring.security.oauth2.client.registration.github.client-secret= github-client-secretspring.security.oauth2.client.registration.facebook.client-id= facebook-client-id
 spring.security.oauth2.client.registration.facebook.client-secret= facebook-client-secretspring.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-idclient-secret: github-client-secretfacebook:client-id: facebook-client-idclient-secret: facebook-client-secretgoogle:client-id: google-client-idclient-secret: google-client-secret 
 

使用 Spring HttpSecurity.oauth2Login()

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

oauth2Login()方法使用OAuth 2.0OpenID 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 {@Overrideprotected 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.0OpenID Connect 1.0提供程序注册。

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

SecurityConfig.java

@Configuration
 public class SecurityConfig extends WebSecurityConfigurerAdapter {@Overrideprotected void configure(HttpSecurity http) throws Exception {http.authorizeRequests().antMatchers("/", "/login**", "/error**").permitAll().anyRequest().authenticated().and().logout().logoutUrl("/logout").logoutSuccessUrl("/").and().oauth2Login();}@Beanpublic 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文件中输入googlegithubfacebookclient-idclient-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


标签:

素材巴巴 Copyright © 2013-2021 http://www.sucaibaba.com/. Some Rights Reserved. 备案号:备案中。