8. Spring Security 5.1之 OAuth 2.0 Login
1.OAuth 2.0 Login
OAuth 2.0登录功能为应用程序提供了使用OAuth 2.0提供程序(例如GitHub)或OpenID Connect 1.0提供程序(例如Google)上的现有帐户登录应用程序的功能。 OAuth 2.0 Login实现了用例:“使用Google登录”或“使用GitHub登录”。
OAuth 2.0登录是使用授权代码授予实现的,如OAuth
2.0授权框架和OpenID Connect Core 1.0中所指定。
1.1 Spring Boot 2.x Sample
Spring Boot 2.x为OAuth 2.0登录带来了完整的自动配置功能。
本部分介绍如何使用Google作为身份验证提供程序配置OAuth 2.0登录示例,并介绍以下主题:
- 1.1.1 初始化安装
- 1.1.2 设置重定向 URI
- 1.1.3 配置 application.yml
- 1.1.4 启动 application
1.1.1 初始化安装
要使用Google的OAuth 2.0身份验证系统进行登录,您必须在Google API控制台中设置项目以获取OAuth 2.0凭据。
Google的OAuth 2.0身份验证实现符合OpenID
Connect1.0规范,并通过OpenID认证
按照OpenID Connect页面上的说明操作,从“设置OAuth 2.0”部分开始。
完成“获取OAuth 2.0凭据”说明后,您应该拥有一个新的OAuth客户端,其凭据包含客户端ID和客户端密钥。
1.1.2 设置重定向 URI
重定向URI是应用程序中的路径,最终用户的用户代理在通过Google进行身份验证并在“同意”页面上授予了对OAuth客户端(在上一步中创建)的访问权限后重定向回的路径。
在“设置重定向URI”子部分中,确保将“授权重定向URI”字段设置为
http://localhost:8080/login/oauth2/code/google
默认重定向URI模板是{baseUrl}/login/oauth2/code/{registrationId}。
registrationId是ClientRegistration的唯一标识符。
1.1.3 配置 application.yml
既然您有一个新的OAuth客户端与Google,您需要配置应用程序以使用OAuth客户端进行身份验证流程
1.转到application.yml并设置以下配置
spring:security:oauth2:client:registration: 1google: 2client-id: google-client-idclient-secret: google-client-secret
Example 6.1. OAuth Client properties
例6.1 OAuth客户端属性
- 1 spring.security.oauth2.client.registration是OAuth客户端属性的基本属性前缀。
- 2 基本属性前缀后面是ClientRegistration的ID,例如google。
1.1.4 启动application
启动Spring Boot 2.x示例并转到http://localhost:8080 然后,您将被重定向到默认的自动生成的登录页面,该页面显示Google的链接。
点击Google链接,然后您将重定向到Google进行身份验证。
使用您的Google帐户凭据进行身份验证后,显示给您的下一页是“同意”屏幕。 “同意”屏幕会要求您允许或拒绝访问您之前创建的OAuth客户端。 单击“允许”以授权OAuth客户端访问您的电子邮件地址和基本配置文件信息。
此时,OAuth客户端从UserInfo端点检索您的电子邮件地址和基本配置文件信息,并建立经过身份验证的会话。
1.2 Spring Boot 2.x Property Mappings
下表概述了Spring Boot 2.x OAuth客户端属性到ClientRegistration
属性的映射:
Spring Boot 2.x | ClientRegistration |
---|---|
spring.security.oauth2.client.registration.[registrationId] | registrationId |
spring.security.oauth2.client.registration.[registrationId].client-id | clientId |
spring.security.oauth2.client.registration.[registrationId].client-secret | clientSecret |
spring.security.oauth2.client.registration.[registrationId].client-authentication-method | clientAuthenticationMethod |
spring.security.oauth2.client.registration.[registrationId].authorization-grant-type | authorizationGrantType |
spring.security.oauth2.client.registration.[registrationId].redirect-uri | redirectUriTemplate |
spring.security.oauth2.client.registration.[registrationId].scope | scopes |
spring.security.oauth2.client.registration.[registrationId].client-name | clientName |
spring.security.oauth2.client.provider.[providerId].authorization-uri | providerDetails.authorizationUri |
spring.security.oauth2.client.provider.[providerId].token-uri | providerDetails.tokenUri |
spring.security.oauth2.client.provider.[providerId].jwk-set-uri | providerDetails.jwkSetUri |
spring.security.oauth2.client.provider.[providerId].user-info-uri | providerDetails.userInfoEndpoint.uri |
spring.security.oauth2.client.provider.[providerId].user-info-authentication-method | providerDetails.userInfoEndpoint.authenticationMethod |
spring.security.oauth2.client.provider.[providerId].userNameAttribute | providerDetails.userInfoEndpoint.userNameAttributeName |
1.3 CommonOAuth2Provider
CommonOAuth2Provider为众多知名提供商预定义了一组默认客户端属性:Google,GitHub,Facebook和Okta。
例如,authorization-uri,token-uri和user-info-uri对于Provider不会经常更改。 因此,提供默认值以减少所需配置是有意义的。
如前所述,当我们配置Google客户端时,只需要client-id和client-secret属性。
以下清单显示了一个示例:
spring:security:oauth2:client:registration:google:client-id: google-client-idclient-secret: google-client-secret
客户端属性的自动默认无缝地在这里工作,因为registrationId(google)与CommonOAuth2Provider中的GOOGLE枚举(不区分大小写)匹配。
对于您可能希望指定其他registrationId(例如google-login)的情况,您仍然可以通过配置provider属性来利用客户端属性的自动默认。
以下清单显示了一个示例:
spring:security:oauth2:client:registration:google-login: 1provider: google 2client-id: google-client-idclient-secret: google-client-secret
- 1registrationId设置为google-login。
- 2provider属性设置为google,它将利用CommonOAuth2Provider.GOOGLE.getBuilder()中设置的客户端属性的自动默认。
1.4 Configuring Custom Provider Properties
有些OAuth 2.0提供程序支持多租户,这会导致每个租户(或子域)使用不同的协议端点。
例如,向Okta注册的OAuth客户端被分配给特定的子域并拥有自己的协议端点。
对于这些情况,Spring Boot 2.x提供了以下用于配置自定义提供程序属性的基本属性:
spring.security.oauth2.client.provider.[providerId]
以下清单显示了一个示例:
spring:security:oauth2:client:registration:okta:client-id: okta-client-idclient-secret: okta-client-secretprovider:okta: 1authorization-uri: https://your-subdomain.oktapreview.com/oauth2/v1/authorizetoken-uri: https://your-subdomain.oktapreview.com/oauth2/v1/tokenuser-info-uri: https://your-subdomain.oktapreview.com/oauth2/v1/userinfouser-name-attribute: subjwk-set-uri: https://your-subdomain.oktapreview.com/oauth2/v1/keys
- 1基本属性(
spring.security.oauth2.client.provider.okta
)允许自定义配置协议端点位置。
1.5 Overriding Spring Boot 2.x Auto-configuration
OAuth客户端支持的Spring Boot 2.x自动配置类是OAuth2ClientAutoConfiguration。
它执行以下任务:
从配置的OAuth客户端属性注册由ClientRegistration组成的ClientRegistrationRepository @Bean。
提供WebSecurityConfigurerAdapter @Configuration并通过httpSecurity.oauth2Login()启用OAuth 2.0登录。
如果您需要根据具体要求覆盖自动配置,可以通过以下方式执行此操作:
- 注册ClientRegistrationRepository @Bean
- 提供WebSecurityConfigurerAdapter
- 完全覆盖自动配置
注册ClientRegistrationRepository @Bean
以下示例显示如何注册ClientRegistrationRepository @Bean:
@Configuration
public class OAuth2LoginConfig {@Beanpublic ClientRegistrationRepository clientRegistrationRepository() {return new InMemoryClientRegistrationRepository(this.googleClientRegistration());}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();}
}
提供WebSecurityConfigurerAdapter
以下示例说明如何使用@EnableWebSecurity提供WebSecurityConfigurerAdapter并通过httpSecurity.oauth2Login()启用OAuth 2.0登录:
@EnableWebSecurity
public class OAuth2LoginSecurityConfig extends WebSecurityConfigurerAdapter {@Overrideprotected void configure(HttpSecurity http) throws Exception {http.authorizeRequests().anyRequest().authenticated().and().oauth2Login();}
}
完全覆盖自动配置
以下示例说明如何通过注册ClientRegistrationRepository @Bean并提供WebSecurityConfigurerAdapter来完全覆盖自动配置。
@Configuration
public class OAuth2LoginConfig {@EnableWebSecuritypublic static class OAuth2LoginSecurityConfig extends WebSecurityConfigurerAdapter {@Overrideprotected void configure(HttpSecurity http) throws Exception {http.authorizeRequests().anyRequest().authenticated().and().oauth2Login();}}@Beanpublic ClientRegistrationRepository clientRegistrationRepository() {return new InMemoryClientRegistrationRepository(this.googleClientRegistration());}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();}
}
1.6 Java Configuration without Spring Boot 2.x
如果您无法使用Spring Boot 2.x并且想要在CommonOAuth2Provider中配置一个预定义的提供程序(例如,Google),请应用以下配置:
@Configuration
public class OAuth2LoginConfig {@EnableWebSecuritypublic static class OAuth2LoginSecurityConfig extends WebSecurityConfigurerAdapter {@Overrideprotected void configure(HttpSecurity http) throws Exception {http.authorizeRequests().anyRequest().authenticated().and().oauth2Login();}}@Beanpublic ClientRegistrationRepository clientRegistrationRepository() {return new InMemoryClientRegistrationRepository(this.googleClientRegistration());}@Beanpublic OAuth2AuthorizedClientService authorizedClientService(ClientRegistrationRepository clientRegistrationRepository) {return new InMemoryOAuth2AuthorizedClientService(clientRegistrationRepository);}@Beanpublic OAuth2AuthorizedClientRepository authorizedClientRepository(OAuth2AuthorizedClientService authorizedClientService) {return new AuthenticatedPrincipalOAuth2AuthorizedClientRepository(authorizedClientService);}private ClientRegistration googleClientRegistration() {return CommonOAuth2Provider.GOOGLE.getBuilder("google").clientId("google-client-id").clientSecret("google-client-secret").build();}
}
1.7 Additional Resources
以下附加资源描述了高级配置选项:
- OAuth 2.0登录页面
- 重定向端点
- UserInfo端点:
- 映射用户权限
- 配置自定义OAuth2User
- OAuth 2.0 UserService
- OpenID Connect 1.0 UserService
8. Spring Security 5.1之 OAuth 2.0 Login相关推荐
- Spring Security系列(11)- Security5.0版本Oauth2开放平台环境搭建
前言 上篇文档,我们了解了OAuth2.0的相关知识,接下来我们搭建一个自己的Oauth2开放平台. 从流程图中,可以看到,后台需要搭建一个认证服务器,负责用户登录.第三方授权等功能,还需要搭建自己的 ...
- java hipster!_通过Java Hipster升级Spring Security OAuth和JUnit测试
java hipster! "我喜欢编写身份验证和授权代码." 〜从来没有Java开发人员. 厌倦了一次又一次地建立相同的登录屏幕? 尝试使用Okta API进行托管身份验证,授权 ...
- 通过Java Hipster升级Spring Security OAuth和JUnit测试
"我喜欢编写身份验证和授权代码." 〜从来没有Java开发人员. 厌倦了一次又一次地建立相同的登录屏幕? 尝试使用Okta API进行托管身份验证,授权和多因素身份验证. 使用单元 ...
- oidc auth2.0_使用Spring Security 5.0和OIDC轻松构建身份验证
oidc auth2.0 "我喜欢编写身份验证和授权代码." 〜从来没有Java开发人员. 厌倦了一次又一次地建立相同的登录屏幕? 尝试使用Okta API进行托管身份验证,授权和 ...
- 使用Spring Security 5.0和OIDC轻松构建身份验证
"我喜欢编写身份验证和授权代码." 〜从来没有Java开发人员. 厌倦了一次又一次地建立相同的登录屏幕? 尝试使用Okta API进行托管身份验证,授权和多因素身份验证. Spri ...
- java oauth2登录以及权限_Spring Cloud集成Security OAuth 2.0权限鉴权验证示例
Spring Cloud集成Security OAuth 2.0权限鉴权验证示例 一.背景说明 目前市场上微服务之间涉及到相互调用的问题,在这个过程中为了验证安全性,需要采用鉴权方式进行管理.目前主流 ...
- Spring Security——OAuth 2.0登录——Google,GitHub,Facebook和Okta
基本概念 OAuth 2.0登录:OAuth 2.0登录功能为应用程序提供了使用户能够通过使用其在OAuth 2.0提供程序(例如GitHub)或OpenID Connect 1.0提供程序(例如Go ...
- Spring Boot OAuth 2.0 客户端
在上一篇<OAuth 2.0 授权码请求>中我们已经可以获取到access_token了,本节将使用客户端来访问远程资源 配置资源服务器 授权服务器负责生成并发放访问令牌(access_t ...
- Spring Security Java Config Preview--官方
原文地址:[1]https://spring.io/blog/2013/07/02/spring-security-java-config-preview-introduction/ [2]https ...
最新文章
- MOS管电源开关电路的软启动
- PL/SQL高级编程
- 云上快报 | 分布式架构引领核心系统架构转型新趋势
- oracle locked time,ORACLE distributed_lock_timeout参数
- 计算机在生物学研究领域的认识,阮晓钢——北京工业大学——主要研究领域涉及:控制科学与工程,人工智能与认知科学,机器人学与机器人技术,计算机应用技术,生物医学工程与生物信息学。...
- python的集成开发环境搭建_Window版本 - Python数据分析集成开发环境 Anaconda安装(超详细)...
- 微软重拳出击:盗版 Windows 将无处遁形!
- 微信快速开发框架(五)-- 利用快速开发框架,快速搭建微信浏览博客园首页文章...
- [leetcode]376. 摆动序列
- 32位电脑适合装W ndows10,32位再见?微软将停止支持32位Win10系统
- 手工打造迅雷9超精简版
- 【笔记】人工智能 一种现代方法 人工智能 一种现代方法 第5章 对抗搜索
- R语言可视化——熵曲线
- Qt使用qwtplot3d绘制3D曲面
- java sci论文,SCI论文中那些容易被混淆的部分!你写错过吗?
- java程序员那些提升_Java程序员如何进行自我提升?
- 华为智慧屏和鸿蒙系统对比,华为s55和v55i对比_华为智慧屏s55和v55i哪个好
- 动漫学日语《灌篮高手》(更新中)
- Python丨Django实现微电影网站
- 名词解释:Web3 账户相关概念大梳理