首页>>后端>>Spring->SpringSecurity整合OAuth2授权的简单示例

SpringSecurity整合OAuth2授权的简单示例

时间:2023-11-30 本站 点击:0

Spring Security为响应式应用提供OAuth2和WebFlux集成。

OAuth2登录

使用OAuth2或OpenID进行认证。

OAuth 2.0登录功能为应用程序提供了一个功能,用户可以使用他们在OAuth 2.0提供商(如GitHub)或OpenID连接1.0提供商(如谷歌)的现有账户登录应用程序。OAuth 2.0登录实现了用例:“使用谷歌登录”或“使用GitHub登录”。

OAuth 2.0登录通过认证码授权实现,具体请参见OAuth 2.0授权框架和OpenID连接核心1.0。

核心配置

创建SpringBoot项目

SpringBoot2.x为OAuth 2.0登录带来了完整的自动配置功能。

本节展示了如何使用谷歌作为认证提供者来配置OAuth 2.0 Login WebFlux示例,包括以下主题:

说明:官网提供的是谷歌认证实现,由于国内无法访问谷歌相关服务,所以我们下面改为GitHub的实现。

除了引入SpringSecurity和WebFlux基础依赖以外,实现OAuth2登录还需要引入OAuth2的依赖。

<dependency>    <groupId>org.springframework.boot</groupId>    <artifactId>spring-boot-starter-oauth2-client</artifactId></dependency>

登录到GitHub

本节展示了如何使用GitHub作为身份验证提供者来配置样例应用程序,包括以下主题:

注册OAuth应用程序

要使用GitHub的OAuth 2.0认证系统登录,您必须注册一个新的OAuth应用程序。

注册OAuth应用程序时,确保授权回调URL设置为http://127.0.0.1:8080/login/oauth2/code/github

注册之后将看到以下两个信息:

授权回调URL(重定向URI)是应用程序中的路径,终端用户的用户代理在通过GitHub验证并在授权应用程序页面上授予对OAuth应用程序的访问权后,被重定向回该路径。

Tip: 默认的重定向URI模板是{baseUrl}/login/oauth2/code/{registrationId}。registrationId是ClientRegistration的唯一标识符。

重要: 如果应用程序在代理服务器后运行,建议检查“代理服务器配置”以确保应用程序已正确配置。另外,请参阅redirect-uri支持的URI模板变量。

配置 application.yml / application.properties

现在你有了一个带有GitHub的新的OAuth应用程序,你需要配置应用程序来使用OAuth应用程序来进行身份验证流程。这样做:

1 去application.properties设置以下配置

spring.security.oauth2.client.registration.github.client-id=636f6778593548198b32spring.security.oauth2.client.registration.github.client-secret=a0fec898d5c89f36dc1a5cbe85193c528fe9574f

spring.security.oauth2.client.registration是OAuth Client属性的基本属性前缀。

基本属性前缀后面是ClientRegistration的ID,例如github。

启动应用程序

启动应用程序并访问http://127.0.0.1:8080。然后你被重定向到默认的自动生成的登录页面,它显示一个GitHub的链接。

点击GitHub链接,然后你被重定向到GitHub进行身份验证。

通过GitHub认证后,下一页显示的是“授权应用程序”。此页将要求您对在上一步中创建的应用程序授权。单击“授权应用程序”以允许OAuth应用程序访问您的个人用户数据信息。

此时,OAuth客户端从UserInfo端点检索您的个人用户信息,并建立一个经过身份验证的会话。

Tip: 有关从UserInfo端点返回的详细信息,请参阅API文档中的“获取认证用户”。

Spring Boot 2.x 属性映射

下表概述了Spring Boot 2.x OAuth Client属性到ClientRegistration属性的映射。

Spring Boot 2.xClientRegistrationspring.security.oauth2.client.registration.[registrationId]registrationIdspring.security.oauth2.client.registration.[registrationId].client-idclientIdspring.security.oauth2.client.registration.[registrationId].client-secretclientSecretspring.security.oauth2.client.registration.[registrationId].client-authentication-methodclientAuthenticationMethodspring.security.oauth2.client.registration.[registrationId].authorization-grant-typeauthorizationGrantTypespring.security.oauth2.client.registration.[registrationId].redirect-uriredirectUrispring.security.oauth2.client.registration.[registrationId].scopescopesspring.security.oauth2.client.registration.[registrationId].client-nameclientNamespring.security.oauth2.client.provider.[providerId].authorization-uriproviderDetails.authorizationUrispring.security.oauth2.client.provider.[providerId].token-uriproviderDetails.tokenUrispring.security.oauth2.client.provider.[providerId].jwk-set-uriproviderDetails.jwkSetUrispring.security.oauth2.client.provider.[providerId].issuer-uriproviderDetails.issuerUrispring.security.oauth2.client.provider.[providerId].user-info-uriproviderDetails.userInfoEndpoint.urispring.security.oauth2.client.provider.[providerId].user-info-authentication-methodproviderDetails.userInfoEndpoint.authenticationMethodspring.security.oauth2.client.provider.[providerId].user-name-attributeproviderDetails.userInfoEndpoint.userNameAttributeName
CommonOAuth2Provider [通用OAuth2提供商]

CommonOAuth2Provider为许多知名的提供商预定义了一组默认的客户端属性:Google,GitHub, Facebook和Okta。

例如,提供商的authorization-uri, token-uri, and user-info-uri不会经常更改。因此,提供缺省值以减少所需的配置是有意义的。

如前所述,在配置GitHub客户端时,只有client-idclient-secret属性是必须的。

配置自定义提供程序属性

在上一节CommonOAuth2Provider,我们了解了SpringSecurity提供了一组预定义的提供商,不过在实际环境下,上面都是不满足我们需要的,此时就需要我们自定义做相关配置。我们这里以国内的Gitee来实践。

前置步骤

登录到Gitee、注册OAuth应用程序。

Gitee OAuth 文档

配置 application.properties
spring.security.oauth2.client.registration.gitee.client-id=26511dbc353a90b647fbab9e24341d3a36a5bd7cf261b846c41fbd4e8500dcdfspring.security.oauth2.client.registration.gitee.client-secret=4230307032d2739d92541b0bf97b242660f24dfaf6d96c545310bbcfd276b702spring.security.oauth2.client.registration.gitee.authorization-grant-type=authorization_codespring.security.oauth2.client.registration.gitee.redirect-uri=http://127.0.0.1:8080/login/oauth2/code/giteespring.security.oauth2.client.registration.gitee.provider=giteespring.security.oauth2.client.registration.gitee.client-name=giteespring.security.oauth2.client.provider.gitee.authorization-uri=https://gitee.com/oauth/authorizespring.security.oauth2.client.provider.gitee.token-uri=https://gitee.com/oauth/tokenspring.security.oauth2.client.provider.gitee.user-info-uri=https://gitee.com/api/v5/userspring.security.oauth2.client.provider.gitee.user-name-attribute=name

配置完成后,启动项目,登录 http://127.0.0.1:8080,直接跳转到授权页面

创建一个Controller
package com.hz.ss.controller;import org.springframework.security.core.annotation.AuthenticationPrincipal;import org.springframework.security.oauth2.core.user.OAuth2User;import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.bind.annotation.RestController;import java.util.Collections;import java.util.Map;/** * @author Dong * @version 1.0 * @date 2022/5/6 */@RestControllerpublic class OAuth2CallbackController {    @GetMapping("/user")    public Map<String, Object> user(@AuthenticationPrincipal OAuth2User principal) {        return Collections.singletonMap("name", principal.getAttribute("name"));    }}

验证

访问 http://127.0.0.1:8080/user


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:/Spring/4482.html