【HarmonyOS】封装用户鉴权工具类

文件概述

AuthUserStore.ets是一个用于管理用户认证状态的工具类,主要功能包括:

  • 初始化本地偏好存储
  • 存储与读取用户信息(如 token)
  • 控制页面跳转时的鉴权逻辑

该类基于 HarmonyOS 的 preferences 模块实现数据持久化,适用于 ArkTS 项目中用户的登录态管理。


引入依赖

typescript 复制代码
import { USER_INFO, CONTEXT, NAV_PATH_STACK } from '../constants'
  • USER_INFO: 用户信息在本地存储中的键名。
  • CONTEXT: 应用上下文标识,用于初始化 preferences
  • NAV_PATH_STACK: 页面导航栈的键名,用于记录页面跳转路径。
typescript 复制代码
import { preferences } from '@kit.ArkData'

HarmonyOS 提供的轻量级数据存储模块,支持同步和异步操作。

typescript 复制代码
import { ILoginResult, INavPathJump } from '../../modules'
  • ILoginResult: 登录成功后返回的数据结构,通常包含 token 等字段。
  • INavPathJump: 页面跳转参数结构,包含页面名称 name 和参数 params

类定义:AuthUserStore

typescript 复制代码
class AuthUserStore {
  // 声明首选项存储对象
  preferences?: preferences.Preferences
}

类成员 preferences 是本地存储实例。初始化调用 init() 后赋值。


核心方法详解

1. 初始化本地存储:init()

typescript 复制代码
 // 初始化首选项仓库
  init() {
    // 从存储中获取上下文
    const ctx = AppStorage.get<Context>(CONTEXT) 
    if (ctx) { // 如果上下文存在
      // 获取指定名称的首选项
      this.preferences = preferences.getPreferencesSync(ctx, { name: USER_INFO }) 
    }
  }

说明:

  • 通过 AppStorage 获取应用上下文 ctx
  • 使用 preferences.getPreferencesSync(...) 创建一个同步的偏好存储实例。
  • 存储名为 USER_INFO,后续所有用户数据都保存在此命名空间下。

调用建议:

在应用启动或首次使用前调用一次 authUser.init()


2. 保存用户信息:setUser(user: ILoginResult)

typescript 复制代码
 setUser(user: ILoginResult) {
    this.preferences?.putSync(USER_INFO, user) // 将用户信息存入首选项
    this.preferences?.flushSync() // 刷新首选项以确保数据保存
  }

说明:

  • 使用 putSync 将用户信息以键值对形式写入本地存储。
  • 调用 flushSync 确保数据立即落盘,防止意外丢失。

3. 获取用户信息:getUser()

typescript 复制代码
getUser() {
  // 从首选项中获取用户信息
  return this.preferences?.getSync(USER_INFO, {} as ILoginResult) as ILoginResult
}

说明:

  • 使用 getSync 从本地存储中获取用户信息。
  • 如果没有找到数据,则返回一个空对象 {} 并转换为 ILoginResult 类型。

4. 页面跳转鉴权:routerPromistions(arg: Function | INavPathJump)

typescript 复制代码
  // 用户鉴权
 routerPromistions(arg: Function | INavPathJump) {
    const routerstack = AppStorage.get(NAV_PATH_STACK) as NavPathStack // 获取导航路径栈
    const token = (this.getUser() as ILoginResult).token // 获取用户令牌
    const isLogin = token ? true : false // 判断用户是否已登录
    if (typeof arg === 'function') { // 如果参数是函数
      isLogin ? arg() : routerstack.pushPathByName('LoginView', `${arg()}`) // 已登录则执行函数,否则跳转到登录页面
    } else { // 如果参数是导航跳转对象
      isLogin ? routerstack.pushPathByName(arg.name, arg.params || '') : // 已登录则跳转到目标页面
      routerstack.pushPathByName('LoginView', arg) // 否则跳转到登录页面
    }
  }

说明:

  • 获取当前用户 token,判断是否已登录。
  • 如果已登录,执行正常跳转;否则跳转至登录页,并携带原始目标路径作为参数。
  • 支持两种传参方式:
    • 函数:返回目标路径字符串。
    • 对象:包含 nameparams 字段。

单例导出

typescript 复制代码
export const authUser = new AuthUserStore()

注意事项

  1. 上下文依赖:

    必须确保 AppStorage 中已设置 CONTEXTNAV_PATH_STACK,否则可能导致运行时错误。

  2. 线程安全:

    所有方法均为同步调用,适合主线程使用,不适用于高并发写入场景。

  3. 数据安全:

    preferences 存储的是明文数据,敏感信息(如 token)建议加密后再存储。

  4. 生命周期管理:

    用户登出时应主动清除本地数据,避免残留数据影响鉴权逻辑。


完整代码

typescript 复制代码
import { USER_INFO, CONTEXT, NAV_PATH_STACK } from '../constants' // 导入常量定义
import { preferences } from '@kit.ArkData' // 导入首选项相关模块
import { ILoginResult, INavPathJump } from '../../modules' // 导入登录结果和导航跳转接口

class AuthUserStore {
  preferences?: preferences.Preferences // 声明首选项存储对象

  // 初始化首选项仓库
  init() {
    const ctx = AppStorage.get<Context>(CONTEXT) // 从存储中获取上下文
    if (ctx) { // 如果上下文存在
      this.preferences = preferences.getPreferencesSync(ctx, { name: USER_INFO }) // 获取指定名称的首选项
    }
  }

  // 设置用户信息
  setUser(user: ILoginResult) {
    this.preferences?.putSync(USER_INFO, user) // 将用户信息存入首选项
    this.preferences?.flushSync() // 刷新首选项以确保数据保存
  }

  // 获取用户信息
  getUser() {
    return this.preferences?.getSync(USER_INFO, {} as ILoginResult) as ILoginResult // 从首选项中获取用户信息
  }

  // 用户鉴权
  routerPromistions(arg: Function | INavPathJump) {
    const routerstack = AppStorage.get(NAV_PATH_STACK) as NavPathStack // 获取导航路径栈
    const token = (this.getUser() as ILoginResult).token // 获取用户令牌
    const isLogin = token ? true : false // 判断用户是否已登录
    if (typeof arg === 'function') { // 如果参数是函数
      isLogin ? arg() : routerstack.pushPathByName('LoginView', `${arg()}`) // 已登录则执行函数,否则跳转到登录页面
    } else { // 如果参数是导航跳转对象
      isLogin ? routerstack.pushPathByName(arg.name, arg.params || '') : // 已登录则跳转到目标页面
      routerstack.pushPathByName('LoginView', arg) // 否则跳转到登录页面
    }
  }
}

export const authUser = new AuthUserStore() // 导出AuthUserStore实例

总结

AuthUserStore 是一个典型的用户状态管理类,结合 HarmonyOS 的本地数据存储机制,实现了简洁高效的登录状态管理和页面跳转控制。适用于需要用户身份验证的 HarmonyOS 应用开发场景。

相关推荐
Python私教18 小时前
鸿蒙 NEXT 也能接 MCP?用 ArkTS 跑通 AI Agent 工具链
人工智能·华为·harmonyos
Swift社区21 小时前
分布式能力在鸿蒙 PC 上到底怎么用?
分布式·华为·harmonyos
nashane1 天前
HarmonyOS 6学习:外接键盘CapsLock与长截图功能的实战调试与完整解决方案
学习·华为·计算机外设·harmonyos
aqi002 天前
一文理清 HarmonyOS 6.0.2 涵盖的十个升级点
android·华为·harmonyos·鸿蒙·harmony
环信即时通讯云2 天前
环信Flutter UIKit适配鸿蒙实战指南
flutter·华为·harmonyos
Swift社区2 天前
鸿蒙 PC 应用启动优化全解析
华为·harmonyos
richard_yuu2 天前
鸿蒙本地数据存储实战|Preferences 封装、数据隔离与隐私合规存储方案
android·华为·harmonyos
Lynnb2 天前
Mac电脑烧录 RK3588 鸿蒙开发板固件教程
华为·harmonyos·鸿蒙系统
我头上有犄角ovo2 天前
HarmonyOS 测肤拍照页实战:Metadata 实时取景 + Core Vision 拍后校验,从 0.001 的 widthRatio 踩坑到可上线
前端·harmonyos