Version: Next
JWT部署集群
由于JWT是无状态的,所以可以轻易的拓展到集群环境
- 只要各个站点使用的用户权限信息一致
- 只要各个站点使用的JWT Secret信息一致
- Jwt相关Filter是一套
- Jwt相关Controller是一套
即可
认证服务器
既然每个站点用的Jwt Controller一样,那可以吧Controller单独抽出来做成一个站点,用来生成Jwt Token,就是认证服务器
服务网关
还可以把JwtFilter也抽出来,做成一个服务网关,去不同站点的请求走同一个Jwt过滤器
- JwtFilter的抽取并不简单,因为它还涉及到请求转发的问题
资源服务器
在后面都是有实际业务数据的资源服务器
基于 GateWay 的 Token 认证服务器 + 模块权限查询
GateWay 网关
- 用 GateWay 作为分布式系统的统一访问入口
- 在 GateWay 上做 Token 的签发认证(使用全局过滤器 GlobalFilter -> 自定义JWTAuthCheckFilter)
- 从配置文件加载不需要认证的 Http Path:例如 登录、注册、查看帖子,直接放行(进入网关转发逻辑)
- 其他路径一律需要网关签发的 Token 才能访问
- 对于未认证用户,重定向到登录页面
- 对于已认证用户,判断 token 是否过期,未过期,从 Token 中解析出 UserName,存入请求头中,进行转发
- 相关模块根据请求头中的 UserName,基于 RBAC 系统获取用户权限
- 登录逻辑:未经过认证、还没有 Token
- 登录表单提交用户名、密码,通过 JPA 查询数据库 (WebFlux 不能用 Mybatis),验证用户名密码
- 验证合法,生成 Token,返回前端 Vue 存储到 Vuex,后续所有请求通过 Axios 拦截器添加 token(请求头)
- GateWay 转发配置
- 在 YAML 中配置转发规则 id 为路由id、uri 为注册中心中的服务名
lb://aservice-rbac
,lb 前缀表示开启负载均衡;predicates.name:xxx
会找到xxxRoutePredicateFactory
类- 在
xxxRoutePredicateFactory
中配置了requestURI.startWith("/add")
表示匹配哪些 Path 转发到配置中配的对应微服务- 跨域:
- 使用 CorsWebFilter 过滤器对
请求源
、请求头
、请求方法
进行设置
博客模块
上传文件
- 创建目录、创建文件、复制到本地文件
- 将上传记录持久化到数据库,方便在查看博客时查询并显示对应文件
下载文件(防盗用)
为了防止资源被滥用(售卖),生成摘要、加密,持久化到数据库,并向文件中写水印
- 根据文件的各种信息+盐生成一个串,把这个串逆序,再和原串拼起来,形成一个回文串
- 计算 sha256 摘要长度 64
- 把这个摘要持久化到数据库,以后靠水印就能查到是谁下的文件
- 把这个摘要以水印形式写到PDF文件上去
二级评论表
- 构建 Model 对应的 Node 类,包含了一个子节点的 List,并且通过 getId()、getParentId() 接口方法,封装成一二级评论树
- Partent_ID 为 0的,表示一级评论,否则就是二级评论
项目问题
跨域
用 GateWay 的 CorsWebFilter 对 请求源
、请求头
、请求方法
进行设置
GateWay 基于 WebFlux 不能用 Mybatis
GateWay 基于 WebFlux 不能用 Mybatis,改用 JPA
权限 Path 和网关转发 Path 不能适配携带参数 Param 的情况
用 startWith() 和 正则匹配
完整代码
链接:https://pan.baidu.com/s/1KGwp00TuHNzPQk3goEgu9A 提取码:17la