【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,判断是否已登录。
  • 如果已登录,执行正常跳转;否则跳转至登录页,并携带原始目标路径作为参数。
  • 支持两种传参方式:
    • 函数:返回目标路径字符串。
    • 对象:包含 name 和 params 字段。

单例导出

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

注意事项

  1. 上下文依赖:

    必须确保 AppStorage 中已设置 CONTEXT 和 NAV_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 应用开发场景。

相关推荐
aqi007 小时前
鸿蒙版本的电子书阅读APP开放源码啦
android·华为·ai编程·harmonyos·鸿蒙
xq952711 小时前
HDC Assistant 插件横空出世
harmonyos
OH_TPC18 小时前
【鸿蒙优选三方库】@ohos/aki:一行代码让 ArkTS 调 C++
harmonyos
wenyiyiyiyiyi19 小时前
我用鸿蒙 ArkTS 写了个自己天天用的备忘录:待办、课表和长期目标,全塞进一块桌面卡片
harmonyos
承渊政道21 小时前
鸿蒙设备远控电脑实测:ToDesk蓝牙键鼠、双模式鼠标、跨端剪贴板,远控电脑更顺手了
计算机外设·电脑·harmonyos·远程工作·todesk
CV工程师丁Sir1 天前
ArkWeb 手记 04|DevTools 调试与缓存清理
java·spring·缓存·harmonyos
程序猿追1 天前
HarmonyOS 6 上做个极简浏览器:Web 组件 + 前进后退 + 加载进度
前端·华为·harmonyos
程序猿追1 天前
HarmonyOS 6 音视频实战:用 AVPlayer 做一个本地音乐播放器
华为·音视频·harmonyos
威哥爱编程1 天前
HarmonyOS 7 多设备 UX 自动检测实战:AppAnalyzer 多设备体检 + 一多工程底线,提前拦截截断重叠大图大字
harmonyos
威哥爱编程1 天前
HarmonyOS 7 安全相机 2.0 实战:数字内容溯源,为拍摄内容提供来源保护
harmonyos