【Spring Boot】Spring Boot 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
)应用程序。
演示工具版本
- Java 11
- Spring 5.1.7.RELEASE
- Spring Boot 2.1.5.RELEASE
- 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-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.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 {@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.0
或OpenID Connect 1.0
提供程序注册。
查找使用GitHub
和Google
覆盖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
文件中输入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
标签:
相关文章
-
无相关信息