it_lv 2 weeks ago
parent
commit
a20f283adf
2 changed files with 39 additions and 29 deletions
  1. 11 8
      第4阶段-登录模块.md
  2. 28 21
      简历汇总参考技术描述.md

+ 11 - 8
第4阶段-登录模块.md

@@ -2,11 +2,14 @@
 
 相关技术:微信登录、短信、自定义注解、aop、策略模式、分布式事务
 
-我们的单点登录是有状态登录,并且有多种登录方式,所以结合了策略模式,定义了抽象策略类,并提供了具体策略实现包括:
+我们的单点登录是有状态(服务端需要存储登录用户信息)登录,并且有多种登录方式,所以结合了策略模式,定义了抽象策略类,并提供了具体策略实现包括:
 
 1. 账户登录:用户名和密码
 2. 微信登录:openId
 3. 手机验证码:短信
+4. 微博登录
+5. QQ登录
+6. ..登录
 
 我们还使用了分布式事务:例如微信登录时,如果用户已存在则直接登录,否则还要隐式去注册用户并初始化账户信息,由于用户和账户是两个服务。
 
@@ -36,11 +39,11 @@
 
 ### 微信登录
 
-前端会生成code,并把code提交到后台:
+小程序调用微信得到code(基于当前使用微信用户生成临时票据),并把code提交到后台:
 
 - 调用微信的远程接口:需要传递code、appid、secretkey给微信服务器
 - 微信服务响应openId和sessionKey,咱们使用openId作为用户的唯一标识
-- 根据这个唯一标识查询mysql的用户表,判断该用户是否已注册过,如果未注册则隐式注册用户
+- 根据这个唯一标识查询mysql的用户表,判断该用户是否已注册过,如果未注册则隐式注册用户,引导用户绑定手机号
   - 新增用户信息
   - 并且初始化账户信息
 - 如果已注册,或者隐式注册成功,则通过uuid生成token
@@ -78,7 +81,7 @@
 Gateway网关实现全局过滤器
 ~~~
 
-项目采用自定义注解、AOP方式实现登录控制,我们只需要在需要登录的接口添加此注解即可。
+**项目采用自定义注解、AOP方式**实现登录控制,我们只需要在需要登录的接口添加此注解即可。
 
 具体开发步骤
 
@@ -88,10 +91,10 @@ AOP封装了登录注解。
 
 1. 自定义了登录注解@Login
 2. 通过环绕通知针对注解进行了赋能
-   1. 在环绕通知中获取请求对象的token:controller很好获取,通过RequestContextHolder对象在通知方法中获取request对象
-   2. 通过token获取redis中的登录信息
+   1. 在环绕通知中获取请求对象的token,通过RequestContextHolder对象在通知方法中获取request对象
+   2. 获取认证授权头信息,通过token获取redis中的登录信息
    3. 如果登录信息为空则抛出异常
-   4. 如果登录信息不为空则把登录信息(userId和userName)放入threadLocal 传递给后续Service
+   4. 如果登录信息不为空则把登录信息(userId)放入threadLocal 传递给后续Service
    5. 业务处理完成之后要释放ThreadLocal防止内存泄漏
 
 <img src="assets/image-20231010152130137.png" alt="image-20231010152130137" style="zoom:80%;" />
@@ -122,7 +125,7 @@ https://blog.csdn.net/u010445301/article/details/111322569
 
  token被盗了怎么办?
 
-在登录信息中添加登录用户的ip。将来每次身份认证时获取请求用户id,两个ip进行比较,如果不一致说明是盗用的,则抛出异常跳转到登录页面。
+在登录信息中添加登录用户的ip对应的行政区域或者手机设备标识。将来每次身份认证时获取请求用户id,两个ip对应行政区域进行比较,如果不一致说明是盗用的,则抛出异常跳转到登录页面。
 
 生成一个随机盐。jwt(有效载荷 userId IP)
 

+ 28 - 21
简历汇总参考技术描述.md

@@ -2,11 +2,19 @@
 
 项目流程图:https://kdocs.cn/join/ggtrrmn?f=101
 
-#### 1. 采用腾讯内容安全对文本,图片,音视频进行审核,确保内容安全前提下通过Kafka异步进行发布专辑/声音到索引库库ElasticSearch
+- MySQL
+- Redis
+- JVM
+- JUC
+- RabbitMQ
+- 框架
+- 项目
+
+#### 1. 采用腾讯内容安全对文本,图片,音视频进行审核,确保内容安全前提下通过MQ异步进行发布专辑到ElasticSearch索引库
 
 **业务背景**:
 
-数据表:专辑表、专辑统计信息表、分类(1,2,3分类)、专辑标签关系表、标签表、标签值表、声音表、声音统计信息表。【金山文档 | WPS云文档】 3、数据表结构 
+数据表:专辑表、专辑统计信息表、分类(1,2,3分类)、专辑标签关系表、标签表、标签值表、声音表、声音统计信息表。 3、数据表结构 
 
 内容创作者**/**听书运营人员 新增保存专辑,需要填写专辑相关信息:1.专辑标题 2.上传专辑封面(上传到MInIO) 3.专辑简介(PC端有富文本编辑器) 4.所属分类 5.专辑标签 6.专辑付费类型等(付费类型、价格类型,折扣)  点击提交保存专辑,对专辑中文本,图片调用**腾讯云内容安全接口**进行内容安全审核。审核通过后才能保存/发布专辑。 专辑被编辑前要求将专辑先下架,编辑内容后再次进行审核,审核通过后才能进行再次上架处理。
 
@@ -14,28 +22,27 @@
 
 - 内容安全方案(腾讯云)
 
-  - 问题:<a href="https://console.cloud.tencent.com/api/explorer?Product=tms&Version=2020-12-29&Action=TextModeration">文本(请求参数内容文本Base64编码)</a>,图片(使用Hutool工具类Base64编码)可以同步审核,立即获取审核结果,但是音频审核只提供异步审核,保存声音业务中,上传音频文件,得到音频文件详情,发起审核任务(得到审核任务ID,关联声音记录-更新声音表审核任务ID),但审核结果不确定审核结束时间。采用分布式定时任务框架**xxl-job、powerJob**开启定时任务(避免超过查询审核结果腾讯QPS,限制每次查询声音数量),检查处于待审核状态声音对应审核任务结果,根据审核任务结果更新声音审核状态,在门户专辑详情页面,只有经过审核声音才能出现在声音列表中。
-
-- RabbitMQ异步进行发布专辑
+  - 问题:<a href="https://console.cloud.tencent.com/api/explorer?Product=tms&Version=2020-12-29&Action=TextModeration">文本(请求参数内容文本Base64编码)</a>,图片(使用Hutool工具类Base64编码)文本图片相对于音视频较小,采用同步审核,立即获取审核结果,但是音频审核只提供异步审核,保存声音业务中,上传音频文件,得到音频文件详情,发起审核任务(得到审核任务ID,关联声音记录-更新声音表审核任务ID),但审核结果不确定审核结束时间。采用分布式定时任务框架**xxl-job、powerJob**开启定时任务(避免超过查询审核结果腾讯QPS,限制每次查询声音数量),检查处于待审核状态声音对应审核任务结果,根据审核任务结果更新声音审核状态,在门户前端专辑详情页面,只有经过审核声音才能出现在声音列表中。通过审核后采用RabbitMQ发布专辑到索引库
 
+  - RabbitMQ异步进行发布专辑
   - 生产者(专辑服务)
 
     - 当内容经过审核,使用**RabbitTemplate**对象发送上架消息(审核通过**专辑ID**)到专辑交换机
 
   - 消费者(搜索服务)
 
-    - 监听上架话题,获取专辑ID,封装专辑对应各项数据-专辑索引对象(1.专辑信息、2.分类信息、 3.主播信息  、 4.统计信息 对应是4个OpenFeign接口调用,**采用线程池+异步任务**),将索引库对象存入专辑索引库、将专辑标题存入提词索引库(搜索自动联想功能)、将专辑ID存入布隆过滤器(初始化)
+    - 监听专辑上架队列,获取专辑ID,封装专辑对应各项数据-专辑索引对象(1.专辑信息、2.分类信息、 3.主播信息  、 4.统计信息 对应是4个OpenFeign接口调用,**采用线程池+异步任务**),将索引库对象存入专辑索引库、将专辑标题存入提词索引库(搜索自动联想功能)、将专辑ID存入布隆过滤器(前提:初始化完成
 
   - 问题:确保消息可靠(不丢失)、幂等性(ES新增文档处理)
 
     - 分析业务是否需要可靠
-  - 分析消费者端是否需要进行幂等性处理
-  
+    - 分析消费者端是否需要进行幂等性处理
+
 - 腾讯云点播
   
   - 优势:云点播(Video on Demand,VOD)面向音视频、图片等媒体,提供制作上传、存储、**转码**、媒体处理、**媒体 AI**、**加速分发播放**、**版权保护**等一体化高品质媒体服务。
   
-  - 问题:声音源文件防盗         结论:无法百分比确保被盗
+  - 问题:声音源文件防盗         结论:无法百分比确保安全
   
   - 启用防盗链:登录 [云点播控制台](https://console.cloud.tencent.com/vod/app-manage),
   
@@ -43,13 +50,13 @@
   
     2. 进入**访问控制**菜单栏,开启 “Referer 防盗链”,“防盗链类型”选择“**白名单**”,文本框中输入允许播放视频的站点域名列表,单击**确定。**
   
-    3. 打开 “Key 防盗链”,输入或随机生成防盗链 Key,单击**确定**。
+    3. 如果是视频,开启 “Key 防盗链”,输入或随机生成防盗链 Key,单击**确定**。
   
       此时,已为域名开启了 Referer 防盗链和 Key 防盗链.
   
-      
+    
 
-#### 2. 采用自定义Token机制实现单点登录(基于微信登录),令牌自动续期,自定义注解验证认证状态
+#### 2. 采用自定义Token机制实现单点登录,令牌自动续期,自定义注解验证认证状态
 
 微服务架构下**会话保持**,传统/单体项目cookie+session(会话)服务端通过Session对象存放用户信息,写会SessionID到Cookie中(JsessionID)Cookie自动提交,服务端根据JsessionID查询服务端Session对象(默认30分钟),包含用户信息。Session未查到到说明用户已退出系统。
 
@@ -60,13 +67,13 @@
 
 **背景:**
 
-客户端有PC端,APP端,小程序等。单点登录是**有状态登录**(服务端存储用户信息),并且有多种登录方式,所以结合了**策略模式**+**工厂模式**,定义了抽象策略类,并提供了具体策略实现包括:
+客户端有PC端,APP端,小程序等。单点登录是**有状态登录**(服务端Redis存储用户信息),并且有多种登录方式:账户密码、手机验证码、第三方社交账户(微信,微博,QQ等),消灭传统编码方式采用大量if elseif分之判断。所以采用**策略模式**+**工厂模式**,定义了抽象策略类,并提供了具体策略实现包括:
 
 1. 账户登录:用户名和密码 听书后台验证账户合法性
 
 2. 手机验证码:短信(阿里云短信服务-判断删除采用lua脚本)   听书后台验证手机号合法性
 
-3. 微信登录:openId(只要获取到OpenID账户合法) 
+3. 微信登录:openId(关键:只要获取到OpenID账户合法) 
 
    > 小程序端
    >
@@ -77,10 +84,10 @@
    > 1. 策略模式+工厂模式
    >
    >    ```
-   >    1.获取不同社交账户唯一标识策略接口   定义一个方法:获取不同平台上对应账户OpenID
-   >    2.提供不同社交平台对应策略实现类(其中IOC容器BeanID=前端登录类型) 全部 实现策略接口获取账户OpenID方法
-   >    3.提供工厂,采用自动注入 通过Map<String, 策略接口> 将策略接口下包含实现类对象注入Map中其中Key:BeanID,Value:实现类对象
-   >    4.工厂中提供根据类型返回对应策略实现类对象-在不同策略实现类中完成不同验证账户合法逻辑
+   >    1.获取不同社交账户唯一标识策略接口   定义一个方法:获取不同社交平台上对应账户OpenID
+   >    2.提供不同社交平台对应策略实现类(关键:其中IOC容器策略实现类对象BeanID=前端登录类型) 全部 实现策略接口获取账户OpenID方法
+   >    3.提供工厂,采用自动注入,将策略策略下所有实现类注入Map<String, 策略接口> Map中其中Key:BeanID,Value:策略实现类对象
+   >    4.工厂中提供根据登录类型(策略类型)返回对应策略实现类对象-在不同策略实现类中完成不同验证账户合法逻辑
    >    ```
    >
    > 2. 以微信为例,调用微信服务端根据前端提交code获取微信服务端账户唯一标识:WXOpenid获取成功:代表账户验证通过
@@ -94,7 +101,7 @@
    >    1. 保存用户信息 关联社交登录类型及OPenID
    >    2. 隐式初始化账户(消费余额账户)
    >       1. 话术1:采用OpenFeign同步调用账户服务 确保分布式事务一致性-Seata
-   >       2. 话术2:采用Kafka异步初始化账户 确保消息可靠
+   >       2. 话术2:采用RabbitMQ异步初始化账户 确保消息可靠
    >
    > 6. 查询到基于用户信息产生Token
    >
@@ -135,11 +142,11 @@
 
 
 
-**校验用户登录状态**:采用网关过滤器、SpringMVC拦截器、AOP切面
+**校验用户登录状态**:可以采用方案:方式一:采用网关过滤器  方式二:SpringMVC拦截器  方式三:AOP切面
 
 - 自定义认证注解:控制接口方法是否登录访问
 
-- 切面:环绕通知作用到自定义注解(对注解修饰方法所在类进行增强,产生代理对象(JDK,CGLIB动态代理))
+- 切面:环绕通知作用到自定义注解(对注解修饰方法所在类进行增强,产生代理对象(JDK动态代理存在接口,产生实现类代理对象,CGLIB动态代理存在普通类产生子类代理对象))
   - 获取请求对象,获取请求头:token
   - 根据token查询Redis中用户信息
   - 如果目标方法注解要求必须登录,且用户信息为空(token不合法,过期)抛出异常前端引导用户登录