SpringSecurity实现OAuth2.0 - 基础版授权服务

2023-11-13

OAuth2.0协议

OAuth3.0概述

OAuth2.0是一个关于授权的开放网络协议。

该协议在第三方应用与服务提供平台之间设置了一个授权层。第三方应用需要服务资源时,并不是直接使用用户帐号密码登录服务提供平台,而是通过服务提供平台的授权层获取token令牌,用户可以在授权时指定token的权限范围和有效期。第三方应用获取到token以后,才可以访问用户资源。

OAuth 2.0定义了四种授权方式:

  • 授权码模式(authorization code):功能最完整、流程最严密的授权模式。特点是通过第三方应用的后台服务器,与服务提供平台的认证服务器进行互动获取资源。
  • 简化模式(implicit):不通过第三方应用服务器,直接在浏览器中向认证服务器申请token令牌,跳过了授权码这个步骤。所有步骤在浏览器中完成,token对用户可见,且第三方应用不需要认证。
  • 密码模式(resource owner password credentials):用户向第三方应用提供自己的用户名和密码。第三方应用使用这些信息,向服务提供平台索要授权。在这种模式中,用户必须把自己的密码给第三方应用,但是第三方应用不得储存密码。这通常用在用户对第三方应用高度信任的情况下,比如第三方应用是操作系统的一部分,或者由一个著名公司出品。而认证服务器只有在其他授权模式无法执行的情况下,才能考虑使用这种模式。
  • 客户端模式(client credentials):指第三方应用以自己的名义,而不是以用户的名义,向服务提供平台进行认证。严格地说,客户端模式并不属于OAuth框架所要解决的问题。在这种模式中,用户直接向第三方应用注册,第三方应用以自己的名义要求服务提供平台提供服务,其实不存在授权问题。

授权码模式

假设有X用户、A系统、B系统,X是A系统中的用户,B系统需要访问A系统获取X用户的信息。

  • B系统中放置向A系统申请授权的入口;
  • X用户点击进入A系统授权页,如果未登录需要登录;
  • X用户允许授权给B系统;
  • A系统重定向到B系统,并携带authorization_code授权码;
  • B系统使用authorization_code授权码到A系统获取token令牌;
  • B系统可以使用token令牌到A系统获取用户资源。

再举个授权码模式的例子:某网站QQ快速登录、账号绑定。

  • 用户点击网站的QQ登录图标
  • 页面跳转到QQ提供的授权页,如果PC上没有登录QQ账号,需要登录
  • 用户允许授权
  • 重定向到网站回调地址,携带授权码authorization_code
  • 网站使用授权码获取token
  • 使用token拉取QQ账号信息
  • 使用QQ账号信息登录、账号绑定等

文档和例子

QQ互联官方文档,http://wiki.connect.qq.com

在这里插入图片描述

Spring Security概述

Spring Security是一个用于快速实现Web应用安全、认证的框架,可以快速和Spring Boot整合。

开发者可以编写配置类继承WebSecurityConfigurerAdapter类,重写config方法自定义登录页面、登录失败逻辑、权限不足逻辑等,并且可以编写Filter实现更加复杂的图片验证码、短信验证码功能。

Spring Security也可以快速实现OAuth2.0授权服务器和资源服务器。在一个Spring Boot应用中,可以使用@EnableAuthorizationServer注解实现授权服务器,使用@EnableResourceServer注解实现资源服务器。

例如:

@SpringBootApplication
@EnableAuthorizationServer
@EnableResourceServer
public class BasicOauth2Application {

    public static void main(String[] args) {
        SpringApplication.run(BasicOauth2Application.class, args);
    }
}

在application.properties文件配置client-id和client-secret参数:

security.oauth2.client.client-id=net5ijy
security.oauth2.client.client-secret=123456

Spring Security实现OAuth2.0基础

引入依赖

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>1.5.13.RELEASE</version>
</parent>

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-security</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.security.oauth</groupId>
        <artifactId>spring-security-oauth2</artifactId>
    </dependency>
</dependencies>

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <configuration>
                <source>1.8</source>
                <target>1.8</target>
                <encoding>UTF-8</encoding>
            </configuration>
        </plugin>
    </plugins>
</build>

Spring Boot启动类配置

加@EnableAuthorizationServer和@EnableResourceServer注解。

@SpringBootApplication
@EnableAuthorizationServer
@EnableResourceServer
public class BasicOauth2Application {

    public static void main(String[] args) {
        SpringApplication.run(BasicOauth2Application.class, args);
    }
}

application.properties配置

配置Security登录用户:

security.user.name=admin
security.user.password=123456

配置client-id和client-secret参数:

security.oauth2.client.client-id=net5ijy
security.oauth2.client.client-secret=123456

受保护资源

@RestController
@RequestMapping(value = "/")
public class TestController {

    @RequestMapping(value = "order/demo")
    public String getDemo() {
        Authentication auth = SecurityContextHolder.getContext().getAuthentication();
        log.info(auth.toString());
        return "Hello world";
    }
}

测试授权码模式

获取authorization_code授权码

使用浏览器访问:

http://localhost:7000/oauth/authorize?response_type=code&client_id=net5ijy&redirect_uri=http://localhost:8080&scope=all

地址:

http://localhost:7000/oauth/authorize

参数:

参数名 说明
response_type code
client_id 根据实际的client-id填写,此处写net5ijy
redirect_uri 生成code后的回调地址,http://localhost:8080
scope 权限范围

在这里插入图片描述

登录,使用的用户名、密码就是在application.properties中配置的admin和123456:

security.user.name=admin
security.user.password=123456

在这里插入图片描述

允许授权:

在这里插入图片描述

看到浏览器重定向到了http://localhost:8080并携带了code参数,这个code就是授权服务器生成的授权码:

在这里插入图片描述

获取token令牌

使用curl命令获取token令牌:

curl --user net5ijy:123456 -X POST -d "grant_type=authorization_code&scope=all&redirect_uri=http%3a%2f%2flocalhost%3a8080&code=Q1dzfj" http://localhost:7000/oauth/token

地址:

http://localhost:7000/oauth/token

参数:

参数名 说明
grant_type 授权码模式,写authorization_code
scope 权限范围
redirect_uri 回调地址,http://localhost:8080需要urlencode
code 就是上一步生成的授权码

在这里插入图片描述

返回值:

{
    "access_token": "547e258c-9c88-4130-a6d5-770b6b6ef3a4",
    "token_type": "bearer",
    "refresh_token": "19cf0168-913e-4f64-a766-72c0d43928ba",
    "expires_in": 43199,
    "scope": "all"
}

这样就获取到了token令牌,该token的访问权限范围是all权限,在12小时后失效。

使用token访问资源

curl http://localhost:7000/order/demo?access_token=547e258c-9c88-4130-a6d5-770b6b6ef3a4

在这里插入图片描述

在资源url后面加上access_token参数。

测试密码模式

获取token令牌

使用curl命令获取token令牌:

curl --user net5ijy:123456 -X POST -d "grant_type=password&username=admin&password=123456&scope=all" http://localhost:7000/oauth/token

地址:

http://localhost:7000/oauth/token

参数名 说明
grant_type 密码模式,写password
scope 权限范围
username 申请授权用户的用户名
password 申请授权用户的密码

在这里插入图片描述

返回值:

{
    "access_token": "20d4f648-2ce4-4198-9f2a-025211efb689",
    "token_type": "bearer",
    "refresh_token": "9caccc03-5b81-48f9-a32e-45538c2f779c",
    "expires_in": 43199,
    "scope": "all"
}

这样就获取到了token令牌,该token的访问权限范围是all权限,在12小时后失效。

使用token访问资源

curl http://localhost:7000/order/demo?access_token=20d4f648-2ce4-4198-9f2a-025211efb689

源码下载

https://gitee.com/xuguofeng2020/springsecurityoauth2

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SpringSecurity实现OAuth2.0 - 基础版授权服务 的相关文章

随机推荐

  • iOS编程基础-OC(九)-专家级技巧:使用运行时系统API(续)

    该系列文章系个人读书笔记及总结性内容 任何组织和个人不得转载进行商业活动 第九章 专家级技巧 使用运行时系统API 9 2 使用运行时系统API 接下来仍然是编写一段程序 该程序会使用运行时系统API以动态的方式创建一个类和一个类实例 然后
  • ES7基础篇-04-索引映射操作(_mappering)

    文章目录 1 简介 2 索引库和索引映射一起创建 3 索引库和索引映射分开创建 4 字段映射解释 5 查看映射关系 6 映射属性详解 1 简介 有了索引库 等于有了数据库中的database 接下来就需要索引库中的类型了 也就是数据库中的表
  • 同步复位、异步复位、亚稳态、建立时间、保持时间、恢复时间、清除时间

    同步 异步复位的概念是重要的基础内容 需对其有较清晰的认识 才能在复位电路的设计时得心应手 本文基于前辈分享 结合自己的理解 浅谈亚稳态 复位电路等相关内容 首先需要明确的是 同步 异步名词背后的两个对象是谁 谁和谁同 谁和谁异 复位的目标
  • java自动化测试之开发工具eclipse安装配置

    java自动化测试之开发工具eclipse安装配置 一 eclipse下载 下载地址 http www eclipse org downloads http www eclipse org downloads 打开连接后 显示如下 选择Ec
  • 单片机期末复习

    一 填空题 1 最小系统能够运行起来的必要条件 单片机的最小系统包含 电源电路 晶振电路 复位电路 单片机最小系统供电正常 提拱能量 单片机芯片工作正常 单片机最小系统各元器件连接电路无误 单片机片外晶振 谐振电容正常 单片机复位电路正常
  • 4.3 AI识虫比赛

    文章目录 一 查看环境并准备数据 二 启动训练 三 启动评估 计算精度指标 四 预测单张图片并可视化预测结果 五 提升方案 一 查看环境并准备数据 查看当前挂载的数据集目录 该目录下的变更重启环境后会自动还原 ls home aistudi
  • import cv2

    windows下 环境 Python 3 8 5 可以通过一下指令查看 python version 遇到的坑 1 在程序中 import cv2 无报错 但运行程序没有效果 直接程序退出 直到注释掉该句导入 程序才正常测试 直接在命令行中
  • Java版的数据结构——栈和队列

    目录 1 栈 Stack 1 1 概念 1 2 栈的使用 1 3 栈的模拟实现 1 4 栈的应用场景 1 4 1 改变元素的序列 1 4 2 将递归转化为循环 2 队列 Queue 2 1 概念 2 2 队列的使用 2 3 队列模拟实现 2
  • 4G 网络跟 5G 的区别

    1 5G网络的速度据说保守可以达到4G的10 20倍 下载一些大型文件 例如电影 大型电脑游戏 将会是分分钟的事 2 5G网络将会率先使用云RAN和虚拟RAN这样的新架构 以促进一个更加中心化网络的建立 并通过身处网络边缘的本地化数据中心来
  • 微信小程序 getUserProfile直接进入fail函数,getUserProfile调用失败:fail desc length does not meet the requirements

    问题描述 我刚开始的getUserProfile的desc是这么写的 wx getUserProfile desc 获取你的昵称 头像 地区及性别用于信息注册 success res gt console log res console l
  • c语言中函数的声明和定义

    点击上方蓝字关注我 了解更多咨询 1 函数声明 无需实现该函数的功能 函数声明只是一个空壳 不会有特定的函数实现 2 函数定义 必须实现该函数的功能 要实现函数的实现 include
  • 动作/行为识别调研

    动作识别调研 1 简介 1 1 基本概念 1 2 难点 2 人体动作识别系统 2 1 传统方法 2 1 1 iDT框架 2 2 深度学习方法 2 2 1 Two Stream双流架构 2 2 2 3D卷积架构 2 2 3 CNN LSTM架
  • 【C++】匿名对象

    文章目录 一 基本概念 二 使用场景 三 注意事项 一 基本概念 匿名对象 也叫作临时对象 就是创建时不用取名的对象 它的生命周期只有一行 例子 class A int main 创建匿名对象 A 生命周期只有这一行 下一行就自动调用析构函
  • 如何在 seaborn 中创建三角相关热图?

    在本教程中 我们将学习在 seaborn 中创建三角形相关热图 顾名思义 相关性是一种度量 用于显示变量的相关程度 相关热图是一种表示数值变量之间关系的图 这些图用于了解哪些变量彼此相关以及它们之间的关系强度 而热图是使用不同颜色的数据的二
  • css text-shadow

  • 喜讯

    日前 华院计算因其在AIGC领域的技术突破和创新成果入选数据猿 2023中国AIGC领域最具商业合作价值企业盘点 基于其数智人产品及解决方案 为不同细分场景 行业 领域提供交互式智能终端 虚拟直播平台和智能视频生成平台等产品及服务 凭借其在
  • 【PKMS】- Settings中应用详情页卸载还原系统应用但数据未清除

    PKMS Settings中应用详情页卸载还原系统应用但数据未清除 一 问题描述 最近工作中出现一个问题 系统应用卸载后重装还原发现应用数据还在 复现操作 1 系统预置该应用在system priv app下 手机里预置的是旧版本的该应用
  • 隐私计算 FATE - 多分类神经网络算法测试

    一 说明 本文分享基于 Fate 使用 横向联邦 神经网络算法 对 多分类 的数据进行 模型训练 并使用该模型对数据进行 多分类预测 二分类算法 是指待预测的 label 标签的取值只有两种 直白来讲就是每个实例的可能类别只有两种 0 或者
  • calico单个pod固定IP多pod固定ip池

    原理 主要利用calico组件的两个kubernetes注解 1 cni projectcalico org ipAddrs 2 cni projectcalico org ipv4pools 单个pod固定IP 利用注解cni proje
  • SpringSecurity实现OAuth2.0 - 基础版授权服务

    OAuth2 0协议 OAuth3 0概述 OAuth2 0是一个关于授权的开放网络协议 该协议在第三方应用与服务提供平台之间设置了一个授权层 第三方应用需要服务资源时 并不是直接使用用户帐号密码登录服务提供平台 而是通过服务提供平台的授权