当前位置: 首页 > news >正文

【pure-admin】项目登录模块分析

项目登录模块分析

登录工作原理

1. 登录流程概述

该项目实现了一套完整的登录认证机制,主要包含以下几个核心部分:

前端登录流程:

  1. 用户在登录页面(src/views/login/index.vue)输入用户名和密码
  2. 点击登录按钮后调用 onLogin 函数,该函数通过 useUserStoreHook().loginByUsername() 方法向服务器发送登录请求
  3. 登录成功后,调用 setToken 函数保存认证信息
  4. 初始化路由(initRouter())并跳转到首页

关键代码:

const onLogin = async (formEl: FormInstance | undefined) => {// 表单验证通过后执行登录useUserStoreHook().loginByUsername({ username: ruleForm.username, password: ruleForm.password }).then(res => {if (res.success) {// 获取后端路由并跳转return initRouter().then(() => {router.push(getTopMenu(true).path);});}});
};

2. Token管理机制

项目采用了 JWT (JSON Web Token) 作为认证凭证,并实现了无感刷新 Token 的方案:

  • Token 存储:

    • accessTokenexpiresrefreshToken 存储在 Cookie 中(自动过期)
    • 用户信息(头像、用户名、角色、权限等)存储在 LocalStorage 中
  • Token 刷新机制:

    • accessToken 即将过期时,系统会自动调用 /refresh-token 接口刷新 Token
    • 使用队列机制确保在刷新 Token 期间的请求能够正确重发

关键代码:

// 设置Token的核心逻辑
export function setToken(data: DataInfo<Date>) {// 计算过期时间expires = new Date(data.expires).getTime();// 保存到Cookie和LocalStorageCookies.set(TokenKey, cookieString, { expires: (expires - Date.now()) / 86400000 });storageLocal().setItem(userKey, { refreshToken, expires, ...userInfo });
}

3. 单点登录实现

项目实现了简版前端单点登录(SSO)功能:

  • 通过 URL 参数传递认证信息(username、roles、accessToken)
  • 检测到 URL 中包含完整的认证参数时,判定为单点登录请求
  • 清空旧信息并保存新信息,然后重定向到正确页面

关键代码:

// 判断是否为单点登录并处理
if (sso.length === mustLength) {// 判定为单点登录// 清空本地旧信息removeToken();// 保存新信息到本地setToken(params);// 重定向到正确页面window.location.replace(newUrl);
}

与后端对接方式

1. API 接口设计

项目通过 /src/api/user.ts 定义了与后端交互的用户相关接口:

  • 登录接口: POST /login - 接收用户名密码,返回用户信息和 Token
  • 刷新 Token 接口: POST /refresh-token - 用于刷新即将过期的 Token
  • 个人信息接口: GET /mine - 获取当前登录用户的详细信息

接口数据结构:

// 登录接口返回数据结构
export type UserResult = {success: boolean;data: {avatar: string;username: string;nickname: string;roles: Array<string>;permissions: Array<string>;accessToken: string;refreshToken: string;expires: Date;};
};

2. HTTP 请求拦截器

项目使用 Axios 进行 HTTP 请求,并通过拦截器实现了以下功能:

  • 请求拦截:

    • 自动添加 Authorization 头部信息
    • 检测 Token 是否过期,自动刷新
    • 实现请求白名单,避免死循环
  • 响应拦截:

    • 统一处理响应数据
    • 错误处理和进度条管理

关键代码:

// 请求拦截器中的Token处理逻辑
const whiteList = ["/refresh-token", "/login"];
return whiteList.some(url => config.url.endsWith(url))? config: new Promise(resolve => {const data = getToken();if (data) {// 检查Token是否过期并刷新const expired = parseInt(data.expires) - now <= 0;if (expired) {// 执行Token刷新逻辑}config.headers["Authorization"] = formatToken(data.accessToken);}resolve(config);});

3. Store 状态管理

项目使用 Pinia 管理用户状态,通过 useUserStore 封装了用户相关的操作:

  • 登录(loginByUsername
  • 登出(logOut
  • 刷新 Token(handRefreshToken
  • 存储和获取用户信息

关键代码:

// 登录方法
async loginByUsername(data) {return new Promise<UserResult>((resolve, reject) => {getLogin(data).then(data => {if (data?.success) setToken(data.data);resolve(data);}).catch(error => {reject(error);});});
}

如何与后端对接

要与实际后端进行对接,需要注意以下几点:

  1. 确保接口地址正确: 根据实际后端服务地址配置请求基础路径
  2. 统一数据格式: 确保后端返回的数据格式与前端定义的 UserResult 等类型一致
  3. Token 策略匹配: 后端需要实现与前端对应的 Token 生成和刷新机制
  4. 权限控制: 后端需要根据用户角色和权限返回对应的路由和操作权限
  5. 单点登录配置: 如果需要启用单点登录,需要与认证中心协调参数传递方式

通过以上分析,可以看出该项目的登录模块设计完善,包含了常规登录、单点登录、Token 自动刷新等功能,为前后端分离架构提供了良好的安全认证机制。

ps:借助AI分析,可能有误,供参考


文章转载自:

http://b5tZW9f7.bcnsL.cn
http://qohWFU5f.bcnsL.cn
http://xmcGmUea.bcnsL.cn
http://4JzivPAH.bcnsL.cn
http://hIRRTo9V.bcnsL.cn
http://i6FE2Xdh.bcnsL.cn
http://E7Yjz4XQ.bcnsL.cn
http://aJDZbpCK.bcnsL.cn
http://CKMdkNto.bcnsL.cn
http://qF7czo3Y.bcnsL.cn
http://tHmjhLaN.bcnsL.cn
http://6xRcmRcX.bcnsL.cn
http://GUp1NNVe.bcnsL.cn
http://CHIbIP6b.bcnsL.cn
http://8rfa7Tlt.bcnsL.cn
http://KPTKf8B1.bcnsL.cn
http://yQbHwMVt.bcnsL.cn
http://pUiXuvQA.bcnsL.cn
http://5OE9jbM8.bcnsL.cn
http://BjTkDdzC.bcnsL.cn
http://jJYM9MDN.bcnsL.cn
http://NsshUPwc.bcnsL.cn
http://8whyROUz.bcnsL.cn
http://Zc4a3EhU.bcnsL.cn
http://wLLTmNr9.bcnsL.cn
http://FJtiJXY3.bcnsL.cn
http://2ZqxcmOL.bcnsL.cn
http://dB2DLp4Y.bcnsL.cn
http://QbWXopSd.bcnsL.cn
http://pY1aejYN.bcnsL.cn
http://www.dtcms.com/a/381438.html

相关文章:

  • 关于Redis不同序列化压缩性能的对比
  • window显示驱动开发—VidPN 对象和接口
  • 系统架构设计师——【2024年上半年案例题】真题模拟与解析(二)
  • 突破性能瓶颈:基于腾讯云EdgeOne的AI图片生成器全球加速实践
  • JavaScript事件机制与性能优化:防抖 / 节流 / 事件委托 / Passive Event Listeners 全解析
  • 文章目录集合
  • 海外短剧系统开发:技术架构与性能优化实践
  • Windsurf 插件正式登陆 JetBrains IDE:让 AI 直接在你的 IDE 里“打工”
  • 西门子 S7-200 SMART PLC 核心指令详解:从移位、上升沿和比较指令到流水灯控制程序实战
  • 【重要通知】ChatGPT Plus将于9月16日调整全球充值定价,低价区将被弃用,开发者如何应对?
  • 跨省跨国监控难题破解:多层级运维的“中国解法”
  • Spring Boot 与 Elasticsearch 集成踩坑指南:索引映射、批量写入与查询性能
  • 基础算法---【高精度算法】
  • React 18的createRoot与render全面对比
  • 在 React 中如何优化状态的使用?
  • 什么是半导体制造中的PVD涂层?
  • 半导体制造的光刻工艺该如何选择合适的光刻胶?
  • 用图论来解决问题
  • 机器视觉在半导体制造中有哪些检测应用
  • 从废料到碳减排:猎板 PCB 埋容埋阻的绿色制造革命,如何实现环保与性能双赢
  • CoCo:智谱推出的企业级超级助手Agent
  • 【高等数学】第十一章 曲线积分与曲面积分——第七节 斯托克斯公式 环流量与旋度
  • 嵌入式基础_STM32F103C8T6移植FreeRTOS(标准库函数)
  • 互联网大厂Java面试实录:从基础到微服务全栈技术答疑
  • DAY 28 类的定义和方法-2025.9.15
  • Linux信号小细节整理
  • Django全栈班v1.04 Python基础语法 20250913 下午
  • 第38次CCFCSP第三题--消息解码
  • 新零售第一阶段传统零售商的困境突破与二次增长路径:基于定制开发开源AI智能名片S2B2C商城小程序的实践探索
  • 金融科技:香港中小型企业(SME)市场规模、零售银行细分、家族办公室、私人银行、商业银行、渠道管理