spring security OAuth开发APP认证框架

本文介绍如何使用OAuth2搭建认证服务器与资源服务器,包括授权模式、登录方式重构、社交模块及注册逻辑的优化,以及使用JWT实现单点登录。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

服务提供商搭建

在这里插入图片描述

认证服务器

添加配置文件,引入@Configuration @EnableAuthorizationServer注解,即可搭建认证服务器

1、授权模式
(1)授权码模式
① /oauth/authorize 获取授权码,让用户跳过做授权的路径,需要带参数(参考OAuth2官网),作为服务提供商,需要知道三件事

  • 哪个应用请求授权,通过client_id识别(可通过yml/properties配置)
security:
  oauth2:
    client:
      client-id: api
      client-secret: apiSecret
  • 请求的是哪个用户,需要输入账号密码
  • 请求什么样的权限,通过scope参数带过来(scope参数是服务提供自定义的字符串)

PS:请求路径 http://xxx/oauth/authorize?response_type=code&client_id=api&redirect_uri=http://example.com&scope=all,报403 Forbidden,需要加入ROLE_USER角色

② /oauth/token 用户根据授权码换取token令牌路径

  • 发送POST请求,头部带上Basic Auth,参数如下
grant_type:authorization_code
client_id:api
code:67r411
redirect_uri:http://example.com
scope:all

(2)密码模式:无需获取授权码,直接使用账号密码获取令牌,请求路径 /oauth/token,头部带上Basic Auth,参数如下

grant_type:password
username:uca46589
password:123456
scope:all

资源服务器

添加配置文件 引入@Configuration @EnableResourceServer注解,即可搭建资源服务器

spring security OAuth 核心源码

在这里插入图片描述
1、解析
(1)TokenEndpoint,类似于controller,用于处理 /oauth/token 请求,根据grant_type类型调用不同的授权模式进行验证
(2)ClientDetailsService,获取第三方信息,存储到ClientDetails,如clientId、clientSecret等
(3)TokenRequest,用于存储用户传入参数,grant_type、scope等
(4)TokenGranter(封装了四种授权模式,包括刷新令牌模式),Token生成接口类,根据请求传入的grant_type挑选实现类,将会产生OAuth2Request(clientDetails、tokenRequest信息整合)和Authentication(当前用户权限信息,通过UserDetailsService读取出来),组合起来,将会产生OAuth2Authentication
(5)AuthorizationServerTokenServices,认真服务器令牌服务,生成OAuth2令牌,其中TokenStore用于令牌存取,TokenEnhancer令牌增强器(用于令牌新增字段)

重构登录方式(自定义认证)

在这里插入图片描述
1、更改登录成功处理器
(1)从请求头中获取Authorization参数,并截取出clientId、clientSecret
(2)通过clientDetailService,传入clientId获取clientDetails,以此验证请求头中的clientId、clientSecret是否授权配置
(3)验证成功后,根据clientId、clientDetails中的scope创建tokenRequest
(4)tokenRequest结合clientDetails创建oAuth2Request
(5)根据创建的oAuth2Request、成功处理器已有的authentication创建oAuth2Authentication
(6)将oAuth2Authentication传入authorizationServerTokenServices构建oAuth2AccessToken,并返回给前端

2、验证码存储逻辑重构
在这里插入图片描述
浏览器端存储验证码到服务器的session中,但APP等前端技术不支持cookie,故session无法使用,将存储转移至redis缓存中进行存储,但需要结合前端传入的deviceId设备参数(唯一标识)

重构社交模块

1、简化模式:导向认证服务器,可以直接获取openId和accessToken,但此时还不能访问我们自己的资源服务,需要用openId换取token令牌

在这里插入图片描述

2、标准授权码模式
在这里插入图片描述
(1)测试情况无法模拟app,故先采用浏览器模式,拿到授权码,再模拟第四步骤以后的操作流程
(2)浏览器会调用OAuth2AuthenticationService 类 中的getAuthToken()方法判断是否有授权码来进行下一步操作,在此方法打断点,获取授权码
(3)拿到授权码后,模拟第四部,返回302,因为社交模块使用的是spring默认的处理器,会跳转到成功页面,故无法模拟4步骤后的流程,因此无法获取令牌,就会报错
(4)APP模块需要自定义社交模块的成功失败处理器

重构注册逻辑

1、新增注册页面工具类,用于将session里的用户信息缓存到redis中;并提供注册功能,将信息插入到数据库
2、新建配置类SpringSocialConfigurerPostProcessor实现BeanPostProcessor,作用是bean初始化之前、之后都会经过两个方法,改写初始化之后的方法,将浏览器调转到注册页的url改为APP的url
3、当App登录,由于未注册,将跳转到App自定义的url请求,获取401状态码及用户信息,APP接受后引导用户到注册页面进行注册
4、注册发送请求为/frontend/p/regist
PS:注册逻辑都需要带上deviceId

Token 处理(令牌配置)

1、基本token参数配置
(1)认证服务器配置文件修改,继承AuthorizationServerConfigurerAdapter

  • 配置入口(切入点),需要指定TokenEndpoints切入点的AuthorizationManager,UserDetailsService;
  • 配置与客户端相关的信息,允许自定义客户端、token过期时间、授权模式

2、令牌存储配置到持久化数据源:
(1)redis持久化数据源配置:TokenConifg
(2)在配置切入点加入tokenStore设置

3、使用JWT(JSON Web Token)替换默认Token:
(1)默认令牌不包含任何信息,若数据库挂掉了,令牌也将无用处,因为拿不到任务的用户信息;而JWT是自包含,可以保护用户信息,这样无需去数据库读取信息;且JWT有密钥签名,可扩展,即允许自定义
(2)在TokenConfig中进行相关配置

4、令牌增强配置:TokenConfig中进行相关配置,DefaultTokenServices中的createAccessToken中支持token增强配置,只有accessTokenEnhancer不为空情况才生效

5、扩展和解析JWT的信息:引入jwttwebtoken工具,后去request中的Authorization,设置解密密钥(JWT密签),并通过此工具进行解析,即可拿到JWT自定义配置的信息

6、token刷新机制:若前端检测到token过期,则发送刷新token请求,获取新的token,提升用户体验,无需重复登录,若refreshToken已失效,则需要用户再次登录

JWT实现SSO单点登录

在这里插入图片描述

### 配置 VSCode 远程 SSH 调试 C++ 程序 #### 安装必要的插件 为了实现远程调试,在 Visual Studio Code 中需安装特定的扩展包,这些工具能够增强编辑器的功能来支持远程开发和C/C++编程。具体来说,应该安装 `C/C++` 和 `Remote - SSH` 插件以及 `Remote Development` 工具集[^1]。 #### 设置SSH连接 建立目标Linux服务器的安全Shell (SSH) 连接是启动任何远程工作的第一步。这通常涉及到生成一对公私钥,并将公共部分添加到远程机器上的授权密钥列表中,以便于无密码登录[^5]。 #### 创建launch.json配置文件 对于每一个打算进行调试的工作区而言,都需要有一个合适的JSON格式配置文件——即 `.vscode/launch.json` 文件。此文件定义了各种参数,比如使用的调试适配器、程序入口点以及其他可能影响调试过程的因素。当涉及GDB作为后台驱动时,可以通过指定适当的目标地址(如 `gdbserver 192.168.199.131:2000 ~/桌面/testvs/main`),让Visual Studio Code知道如何连接至远端正在监听的GDB服务实。 #### 编写tasks.json构建任务 为了让编译工作顺利开展,还需要编写一个名为`.vscode/tasks.json` 的构建脚本。该文档指定了用于编译源码的具体指令链表;如选择 `/usr/bin/g++` 作为默认编译器,并提供有关输入输出位置的信息给定路径下的所有CPP文件及其依赖项。这样做的好处是可以确保每次修改代码后都能快速重新编译最新的版本供测试之用[^4]。 ```json { "version": "2.0.0", "tasks": [ { "label": "build hello world", "type": "shell", "command": "/usr/bin/g++", "args": [ "-g", "${workspaceFolder}/*.cpp", "-o", "${workspaceFolder}/hello" ], "group": { "kind": "build", "isDefault": true }, "problemMatcher": ["$gcc"] } ] } ``` #### 开始调试会话 一旦上述准备工作完成,就可以利用VSCode内置的强大功能轻松发起一次完整的远程调试流程。只需按下F5键或点击左侧边栏中的绿色播放按钮即可触发整个链条的动作:从自动执行预设好的构建任务直至最终附着上已准备就绪的GDBServer进程开始单步跟踪分析。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值