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

相关推荐
zhanshuo4 小时前
如何用 ArkTS 实现丝滑又安全的表单输入验证?一篇文章讲清楚!
harmonyos
zhanshuo4 小时前
掌握 ArkTS 复杂数据绑定:从双向输入到多组件状态同步
harmonyos
SuperHeroWu75 小时前
【HarmonyOS】鸿蒙应用开发中常用的三方库介绍和使用示例
华为·harmonyos
jz_ddk6 小时前
[HarmonyOS] 鸿蒙LiteOS-A内核深度解析 —— 面向 IoT 与智能终端的“小而强大”内核
物联网·学习·华为·harmonyos
liuhaikang10 小时前
【鸿蒙HarmonyOS Next App实战开发】视频提取音频
华为·音视频·harmonyos
爱笑的眼睛1111 小时前
HarmonyOS应用上架流程详解
华为·harmonyos
zhanshuo1 天前
构建可扩展的状态系统:基于 ArkTS 的模块化状态管理设计与实现
harmonyos
zhanshuo1 天前
ArkTS 模块通信全解析:用事件总线实现页面消息联动
harmonyos
codefish7981 天前
鸿蒙开发学习之路:从入门到实践的全面指南
harmonyos
yrjw2 天前
一款基于react-native harmonyOS 封装的【文档】文件预览查看开源库(基于Harmony 原生文件预览服务进行封装)
harmonyos