Springboot 统一登录设计实现

背景

公司产品矩阵比较丰富的时候, 用户在不同系统之间来回切换, 对产品用户体验上比较差, 并且增加用户密码管理成本
对于每个产品的独立体系也会导致产品安全度下降

因此实现单点登录对用户使用体验以及效率有很大的提升

系统架构图:

2024-02-27T08:08:00.png

前端 Vue.js 应用

  • 统一登录入口

    • 提供手机号和微信扫码登录选项。
    • 登录成功后将 JWT 存储在 localStorage 中。 为了规范 使用 Authorization 作为Key token 前缀为 bearer
  • 首页

    • 显示产品按钮,根据用户权限(由教师设置)和产品有效期进行动态展示。
    • 用户点击按钮跳转到相应产品链接,并带上 JWT。

后端 Spring Boot 应用

  • 安全认证

    • 使用 Spring Security 进行认证。
    • 登录成功后颁发 JWT。
    • 将 JWT 存储到 Redis 中并写入序列化用户对象到redis
    • 将拦截接口 对jwt 在验证时检查 Redis 中的有效性。
  • 数据库设计

    • sys_user: 存储用户信息,包括登录时间。
    • sys_product: 存储产品信息,包括链接和有效期。
    • sys_product_permissions: 存储用户的产品权限。
    • sys_product_validity: 存储用户产品的有效期。
    • sys_user_orders: 存储用户订单信息,包括支付状态和产品信息。
  • 表之间的关联
    2024-02-27T08:53:08.png

流程

  1. 用户在前端输入手机号进行登录,或者使用微信扫码登录。
  2. 后端验证登录信息,生成后存储到redis 并返回 JWT给前端。
  3. 前端将 JWT 存储在 localStorage 中。
  4. 用户访问首页,前端根据用户权限和产品有效期动态展示页面内容。
  5. 用户点击按钮跳转到相应产品链接,前端将 JWT 作为参数传递到跳转后的地址 (跳转后需要额外解析)。
  6. 后端接收到请求,验证 JWT 的有效性,并检查用户是否有权限和产品是否在有效期内。
  7. 后端返回相应产品页面或拒绝访问(无权限跳回统一登录首页)。

其他

  • 教师端通过管理界面设置用户权限
  • 学生可以在产品页面购买产品,生成订单并支付。

前端 Vue.js 应用

  • 统一登录入口

    • 用户可以选择使用手机号登录或微信扫码登录。
    • 手机号登录时,前端向后端发送登录请求,包括手机号和验证码。
    • 微信扫码登录时,前端生成扫码链接,用户使用微信扫码后前端轮询后端确认登录状态。
  • 首页

    • 用户登录成功后,前端向后端请求用户权限和产品有效期信息。
    • 根据返回的数据,前端动态展示产品按钮。
    • 用户点击按钮时,前端将用户的 JWT 作为参数附加到产品链接后跳转。

后端 Spring Boot 应用

  • 安全认证

    • 使用 Spring Security 框架实现安全认证。
    • 配置手机号登录和微信扫码登录的认证逻辑。
    • 登录成功后,生成 JWT 并返回给前端,同时将 JWT 存储到 Redis 中。
  • MyBatis Plus 数据库交互

    • 使用 MyBatis Plus 简化数据访问层的开发。
    • 定义实体类对应数据库表结构。
    • 编写 Mapper 接口和 Mapper XML 文件,实现数据库操作。
  • 业务逻辑

    • 使用 MyBatis Plus 的 Service 层对业务逻辑进行封装。
    • 实现用户登录、获取用户权限、验证产品有效期等业务逻辑。
    • 当用户购买产品时,生成订单并更新数据库中的订单信息。
  • Redis 缓存与 Lua 脚本实现限流

    • 将用户的 JWT 存储到 Redis 缓存中,用于快速验证用户身份。
    • 使用 AOP 切面编程实现限流功能,结合 Redis 的 Lua 脚本实现高效的分布式限流。

流程

  1. 用户通过前端界面选择登录方式并输入登录信息。
  2. 前端将登录信息发送至后端进行验证。
  3. 后端验证登录信息,生成并返回 JWT 给前端。
  4. 前端将 JWT 存储到 localStorage 中。
  5. 用户访问首页,前端根据用户权限和产品有效期信息动态展示页面内容。
  6. 用户点击产品按钮,前端将带有 JWT 的请求发送至后端。
  7. 后端接收到请求,验证 JWT 的有效性,并根据用户权限和产品有效期决定是否返回相应页面内容。

备注

  • 教师端通过后台管理界面设置用户权限和产品有效期。
  • 学生可以在产品页面购买产品,生成订单并支付,相关订单信息存储在数据库中。
  • 系统中的用户信息、权限信息、订单信息等都存储在 MySQL 数据库中,使用 Redis 缓存提高系统性能,并通过 Lua 脚本实现分布式限流。

Security 流程图

!(https://img2018.cnblogs.com/i-beta/1328274/202002/1328274-20200209173305680-1946265328.png)[img]

 		     +---------------------+
             |	 统一登录入口        |
             | 手机号登录|微信扫码登录|
             +----------+----------+
                        |
                        v
            +---------------------+
            | 绑定公众号           |
            | 弹出绑定公众号窗口   |
            +----------+----------+
                        |
                        v
               +---------+--------+
               | 首页              |
               | 显示产品按钮      |
               +-------+-----------+
              	      |
               	      v
              +-------+--------+
              | 产品页面        |
              | 显示具体产品内容 |
              +-----------------+

后端 Spring Boot 应用:

      +------------------------+
      | 安全认证                |
      | Spring Security配置     |
      +---------+--------------+
                |
                v
      +---------+--------------+
      | 数据库交互               |
      | MySQL、JPA/MyBatis Plus |
      +---------+--------------+
                |
                v
      +---------+--------------+
      | 业务逻辑                |
      | 用户权限、产品有效期      |
      +---------+--------------+
                |
                v
      +---------+--------------+
      | Redis 缓存              |
      | 存储 JWT                |
      +------------------------+

相关推荐

  1. SpringBoot+vue实现登录功能

    2024-03-20 18:46:02       33 阅读
  2. 统一登陆实现简化流程

    2024-03-20 18:46:02       36 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-03-20 18:46:02       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-03-20 18:46:02       100 阅读
  3. 在Django里面运行非项目文件

    2024-03-20 18:46:02       82 阅读
  4. Python语言-面向对象

    2024-03-20 18:46:02       91 阅读

热门阅读

  1. 前端项目构建过程中涉及低代码部分思考

    2024-03-20 18:46:02       40 阅读
  2. H5与原生交互方式

    2024-03-20 18:46:02       39 阅读
  3. 游戏防沉迷系统相关内容

    2024-03-20 18:46:02       45 阅读
  4. LeetCode每日一题[C++]-1793.好子数组的最大分数

    2024-03-20 18:46:02       46 阅读
  5. Git 命令记录

    2024-03-20 18:46:02       42 阅读
  6. 面试题:指针和引用的区别

    2024-03-20 18:46:02       46 阅读
  7. 【CSS】实现文字描边

    2024-03-20 18:46:02       35 阅读