【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 应用开发场景。

相关推荐
Chen--Xing10 分钟前
第一届OpenHarmonyCTF--Crypto--WriteUp
网络安全·密码学·harmonyos
HarmonyOS_SDK2 小时前
京东携手HarmonyOS SDK首发家电AR高精摆放功能
harmonyos
塞尔维亚大汉2 小时前
鸿蒙内核源码分析(根文件系统) | 先挂到/上的文件系统
源码·harmonyos
别说我什么都不会2 小时前
【OpenHarmony】鸿蒙开发之Checksum
harmonyos
周胡杰5 小时前
鸿蒙arkts使用关系型数据库,使用DB Browser for SQLite连接和查看数据库数据?使用TaskPool进行频繁数据库操作
前端·数据库·华为·harmonyos·鸿蒙·鸿蒙系统
simple丶6 小时前
【HarmonyOS】基于Axios封装网络请求工具类
harmonyos·arkts·arkui
万少7 小时前
2-自然壁纸实战教程-AGC 新建项目
前端·harmonyos
coder_pig21 小时前
跟🤡杰哥一起学Flutter (三十四、玩转Flutter手势✋)
前端·flutter·harmonyos
simple丶21 小时前
【HarmonyOS】鸿蒙蓝牙连接与通信技术
harmonyos·arkts·arkui