前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >OAuth2使用Redis来存储客户端信息以及AccessToken

OAuth2使用Redis来存储客户端信息以及AccessToken

作者头像
恒宇少年
修改于 2023-09-20 10:47:07
修改于 2023-09-20 10:47:07
2.7K00
代码可运行
举报
运行总次数:0
代码可运行

使用Redis来存储OAuth2相关的客户端信息以及生成的AccessToken是一个不错的选择,Redis与生俱来的的高效率、集群部署是比较出色的功能,如果用来作为服务认证中心数据存储,可以大大的提高响应效率。

Redis还支持超时自动删除功能,OAuth2所生成的AccessToken相关的数据在超过配置的有效时间后就会自动被清除,这样也隐形的提高了接口的安全性。

既然Redis可以做到这么好,我们该怎么实现代码逻辑呢?

ApiBoot OAuth2是支持使用Redis来存储AccessToken的,只需要修改application.yml一个配置就可以实现,相关的使用也可以通过查看文档了解。

ApiBoot Security OAuth组件系列文章

创建项目

我们使用IDEA开发工具创建一个SpringBoot项目,在项目的pom.xml添加我们需要的ApiBoot统一版本依赖以及安全组件依赖,如下所示:

代码语言:javascript
代码运行次数:0
运行
复制
<dependencies>
  <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
  </dependency>
  <dependency>
    <groupId>org.minbox.framework</groupId>
    <artifactId>api-boot-starter-security-oauth-jwt</artifactId>
  </dependency>
</dependencies>
<dependencyManagement>
  <dependencies>
    <dependency>
      <groupId>org.minbox.framework</groupId>
      <artifactId>api-boot-dependencies</artifactId>
      <version>2.2.0.RELEASE</version>
      <type>pom</type>
      <scope>import</scope>
    </dependency>
  </dependencies>
</dependencyManagement>

添加Redis支持

既然我们本章需要用到Redis,我们需要在项目内添加相关的依赖,SpringBoot已经为我们提供了封装好的依赖,在pom.xml文件内dependencies节点下添加,如下所示:

代码语言:javascript
代码运行次数:0
运行
复制
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

配置Redis连接信息

SpringBootRedis的连接、数据操作都做了封装,我们只需要在application.yml配置文件内添加响应的Redis连接信息即可。

spring-boot-starter-data-redis依赖所需要的配置都是由RedisProperties类提供,该类内有部分配置字段存在默认值,部分源码如下所示:

代码语言:javascript
代码运行次数:0
运行
复制
@ConfigurationProperties(prefix = "spring.redis")
public class RedisProperties {

    /**
     * Database index used by the connection factory.
     */
    private int database = 0;

    /**
     * Connection URL. Overrides host, port, and password. User is ignored. Example:
     * redis://user:password@example.com:6379
     */
    private String url;

    /**
     * Redis server host.
     */
    private String host = "localhost";

    /**
     * Login password of the redis server.
     */
    private String password;

    /**
     * Redis server port.
     */
    private int port = 6379;
  //...
}   

默认配置下连接Redis只需要在application.yml配置spring.redis.password,如下所示:

代码语言:javascript
代码运行次数:0
运行
复制
spring:
  # 配置Redis连接信息
  redis:
    password: 123123

password是连接Redis所需要的密码,在redis.conf文件内配置。

相关配置解释:

  • spring.redis.database:如果你使用的Redis DataBase并不是默认的0索引,需要修改该配置
  • spring.redis.host:默认为localhost,如果不是本地使用,需要修改该配置
  • spring.redis.url:这是一个连接字符串,如天配置了会自动覆盖databasehostport等三个配置信息
  • spring.redis.port:默认为Redis的端口号6379,如已修改Redis的监听端口号,需要修改该配置

启用ApiBoot OAuth Redis

ApiBoot OAuth提供了redis配置选项,在application.yml文件内通过api.boot.oauth.away配置参数指定,如下所示:

代码语言:javascript
代码运行次数:0
运行
复制
api:
  boot:
    security:
      # 配置内存安全用户列表
      users:
        - username: yuqiyu
          password: 123123
    oauth:
      # 配置使用Redis存储OAuth2相关数据
      away: redis
      # 配置客户端列表
      clients:
        - clientId: minbox
          clientSecret: chapter

为了方便演示,我们使用ApiBoot Security的内存方式配置了一个用户yuqiyu,而且还修改了默认client信息,新加了minbox客户端。

如果对ApiBoot Security用户配置或者ApiBoot OAuth的客户端配置不了解,可以查看官方文档:

运行测试

在运行测试之前我们添加一个名为ApiController的控制器用来测试,代码如下所示:

代码语言:javascript
代码运行次数:0
运行
复制
/**
 * 测试Api控制器
 *
 * @author 恒宇少年
 */
@RestController
@RequestMapping(value = "/api")
public class ApiController {
    /**
     * 测试请求,需携带令牌访问
     *
     * @return
     */
    @GetMapping(value = "/index")
    public String index() {
        return "this is index";
    }
}

测试点:查看Redis存储的AccessToken

预计效果是当我们发送获取AccessToken的请求时,会自动将生成的AccessToken存储到Redis

下面我们使用CURL命令来尝试获取下AccessToken,如下所示:

代码语言:javascript
代码运行次数:0
运行
复制
~ curl minbox:chapter@localhost:9090/oauth/token -d 'grant_type=password&username=yuqiyu&password=123123'
{"access_token":"38a7ee20-2fad-43c5-a349-31e6f0ee0f29","token_type":"bearer","refresh_token":"f469b1e8-f63c-4be9-8564-2603f8458024","expires_in":7199,"scope":"api"}

下面我们使用redis-cli来看下是否已经将AccessToken存储到Redis,如下所示:

代码语言:javascript
代码运行次数:0
运行
复制
~ redis-cli 
127.0.0.1:6379> auth 123123
OK
127.0.0.1:6379> keys *
 1) "uname_to_access:minbox:yuqiyu"
 2) "refresh_to_access:f469b1e8-f63c-4be9-8564-2603f8458024"
 3) "access_to_refresh:1ea8e5cd-ea63-4a73-969f-9e7767f25f30"
 4) "auth:38a7ee20-2fad-43c5-a349-31e6f0ee0f29"
 5) "refresh_auth:6898bef4-f4a7-4fa9-858b-a4c62a1567d8"
 6) "refresh:6898bef4-f4a7-4fa9-858b-a4c62a1567d8"
 7) "refresh_auth:f469b1e8-f63c-4be9-8564-2603f8458024"
 8) "access:38a7ee20-2fad-43c5-a349-31e6f0ee0f29"
 9) "refresh_to_access:6898bef4-f4a7-4fa9-858b-a4c62a1567d8"
10) "auth_to_access:f02ceb5faa4577222082842b82a57067"
11) "refresh:f469b1e8-f63c-4be9-8564-2603f8458024"
12) "access_to_refresh:38a7ee20-2fad-43c5-a349-31e6f0ee0f29"
13) "client_id_to_access:minbox"

结果往往让人感觉惊喜,看到这里我们已经成功的把OAuth2生成的AccessToken存储到了Redis,如果AccessToken对应的数据超过了expires_in时间,就会自动被清除。

测试点:携带AccessToken访问接口

我们可以拿着生成的AccessToken来访问在上面添加的测试ApiController内的接口,如下所示:

代码语言:javascript
代码运行次数:0
运行
复制
~ curl -H 'Authorization: Bearer 38a7ee20-2fad-43c5-a349-31e6f0ee0f29' http://localhost:9090/api/index
this is index

我们可以拿到接口的返回的接口,这也证明了一点,AccessToken的验证是没有问题的,OAuth2拿着请求携带的AccessTokenRedis验证通过。

敲黑板,划重点

ApiBoot OAuth所支持的3种存储方式都已经通过文章的方式告知大家,每一种方式都做到了精简,简单的配置,添加相关的依赖,就能够实现在之前让很多人头疼的集成。

如果在生产环境中数据量较大,建议使用Redis集群来解决存储AccessToken的问题。

如果你对ApiBoot OAuth其它两种存储方式不了解,可以查看我编写的ApiBoot系列的文章:ApiBoot开源框架各个组件的系列使用文章汇总

代码示例

如果您喜欢本篇文章请为源码仓库点个Star,谢谢!!! 本篇文章示例源码可以通过以下途径获取,目录为apiboot-oauth-use-redis-storage

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
常见的手写代码题集
要求是 yield 后面只能是 Promise 或 Thunk 函数,详见 es6.ruanyifeng.com/#docs/gener…
前端迷
2020/02/19
7240
2篇搞定CSS基础知识----第二篇
padding-top(上内边距),padding-right(右内边距),padding-bottom(下内边距),padding-left(左内边距)
Lemon黄
2019/10/22
4220
2篇搞定CSS基础知识----第二篇
【CSS3】CSS3 2D 转换 - translate 平移 ( transform: translate 样式 | 百分比移动相对于元素自身尺寸 | 百分比移动实现绝对定位的居中效果 )
CSS3 中的 Transform 转换 , 可以实现 标签元素 的 位移 / 旋转 / 缩放 ;
韩曙亮
2023/04/24
1.2K0
【CSS3】CSS3 2D 转换 - translate 平移 ( transform: translate 样式 | 百分比移动相对于元素自身尺寸 | 百分比移动实现绝对定位的居中效果 )
CSS进阶内容—浮动和定位详解
当然如果没有学习之前的知识,可以到我的主页中查看之前的文章:秋落雨微凉 - 博客园
秋落雨微凉
2022/10/25
2.3K0
CSS进阶内容—浮动和定位详解
如何迅速熟练掌握盒子模型?(学习方法很重要)
----在前面文章冲浪笔记4中仅对盒子模型进行介绍,感兴趣的小伙伴也可以去看看,这篇文章将具体描述,并推荐一个自己觉得好用的记忆方法,喜欢的小伙伴可以收藏🧐常用到的:①居中效果margin: auto;②圆角border-radius: 10px;③三合一边框boder: 10px solid red;----一、概念1、CSS假定每⼀个标签都是⼀个矩阵,围绕着这个矩阵,从内到外展开⼀系列的属性来描述它2、组成:content、padding、boder、margin二、记忆方法1、俯视一个完整的篮球场,篮
申小兮
2023/04/07
2580
如何迅速熟练掌握盒子模型?(学习方法很重要)
五. css 布局之 position(定位)
包含块( containing block ) 正常情况下: 包含块就是离当前元素最近的祖先块元素,
小海怪的互联网
2020/10/26
2.3K0
CSS 制作爱心
方案1 纯CSS+HTML 代码 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>Document</title> <style>
无道
2019/11/13
1.1K0
CSS 制作爱心
HTML基础第四课(冲浪笔记4)
概念:CSS假定每⼀个标签都是⼀个矩阵,围绕着这个矩阵,从内到外展开⼀系列的属性来描述它,这⼀系列就被称为【盒⼦模型】
申小兮
2022/10/14
4180
HTML基础第四课(冲浪笔记4)
零基础学前端开发技术之第七章 浮动塌陷
张哥编程
2024/12/19
860
css笔记 - 张鑫旭css课程笔记之 margin 篇
relative可定位,但是不改变容器尺寸和占据的空间 margin不同,margin也在盒模型中。 从border开始往里边,是可视尺寸clientWidth部分。 加上margin,是占据尺寸outerWidth margin可以改变元素尺寸,正值宽度变小,负值宽度变大。 margin也可以定位
xing.org1^
2018/09/20
2.7K0
css笔记 - 张鑫旭css课程笔记之 margin 篇
剖析一些经典的CSS布局问题,为前端开发+面试保驾护航
这样做的优点就是在图文混排的时候可以很好的使文字环绕在图片周围。另外当元素浮动了起来之后,它有着块级元素的一些性质例如可以设置宽高等,但它与inline-block还是有一些区别的,第一个就是关于横向排序的时候,float可以设置方向而inline-block方向是固定的;还有一个就是inline-block在使用时有时会有空白间隙的问题
桃翁
2019/11/09
1.2K0
剖析一些经典的CSS布局问题,为前端开发+面试保驾护航
CSS布局之需要掌握的小技巧
vertical-align属性对于inline元素、inline-block元素和table-cell元素有效,对块元素无效。
xinxin-l
2022/03/29
4280
CSS布局之需要掌握的小技巧
前端面试 【CSS】— 让元素垂直居中的方法有哪些?
如何让元素垂直居中?这是一道很常见的面试题,大致有以下5种: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>让元素垂直居中的方法有哪些
越陌度阡
2021/11/11
6830
css3的一些新属性总结
box-sizing规定了盒子的计算方式,常用于消除hover时,盒子之间的影响,有三个属性:
一个淡定的打工菜鸟
2018/09/06
3920
CSS&HTML面经专题——(三)CSS定位/盒模型/经典布局/浮动布局与BFC
position:static | relative | absolute | fixed | center | page | sticky
玖柒的小窝
2021/10/26
2.1K0
CSS&HTML面经专题——(三)CSS定位/盒模型/经典布局/浮动布局与BFC
【CSS3】css开篇基础(5)
轻量级:一个图标字体比一系列的图像要小,一旦字体加载了,图标就会马上渲染出来,减少了服务器的请求
E绵绵
2024/10/27
2250
【CSS3】css开篇基础(5)
配合JQuery练习
<!-- <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <script type="text/javascript" src="http://ajax.microso
仇诺伊
2018/09/12
9220
网络编程(五)之HTML5和CSS3提高
HTML5 的新增特性主要是针对于以前的不足,增加了一些新的标签、新的表单和新的表单属性等。
前端小tips
2021/12/06
1.4K0
网络编程(五)之HTML5和CSS3提高
HTML常用布局方式
前言:对HTML的学习,在了解了基础的语法之后,需要学习与掌握的是,HTML的基础布局方式,这个是网页布局的基础,本文讲解是当前常用布局。
GeekLiHua
2025/01/21
2510
HTML常用布局方式
八.CSS之animation(动画)
​ 多个属性间使用,隔开 ​ 如果所有属性都需要过渡,则使用all关键字 ​ 大部分属性都支持过渡效果,注意过渡时必须是从一个有效数值向另外一个有效数值进行过渡(auto不是有效数值,过渡动画效果不会生效)
小海怪的互联网
2020/11/24
1.5K0
相关推荐
常见的手写代码题集
更多 >
目录
  • ApiBoot Security OAuth组件系列文章
  • 创建项目
  • 添加Redis支持
    • 配置Redis连接信息
  • 启用ApiBoot OAuth Redis
  • 运行测试
    • 测试点:查看Redis存储的AccessToken
    • 测试点:携带AccessToken访问接口
  • 敲黑板,划重点
  • 代码示例
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档