如何将加密和解密函数应用到Pinia状态中?

简介: 如何将加密和解密函数应用到Pinia状态中?

要将加密和解密函数应用到 Pinia 状态中,我们需要创建一个 Pinia 插件,在状态持久化的过程中自动调用加密和解密方法。这样可以确保状态在存储时被加密,读取时被解密。

以下是完整的实现方案:

// plugins/piniaEncryption.js
import { encrypt, decrypt } from '../utils/crypto';

/**
 * 创建Pinia加密存储插件
 * @param {Object} options - 插件配置
 * @param {string} [options.storage=localStorage] - 存储方式,可选localStorage或sessionStorage
 * @param {Array<string>} [options.includeStores] - 仅加密指定的store,为空则加密所有
 * @returns {Function} Pinia插件
 */
export function createEncryptionPlugin(options = {}) {
  const { 
    storage = localStorage,
    includeStores = []
  } = options;

  return function encryptionPlugin(context) {
    const { store } = context;

    // 如果指定了需要加密的store列表且当前store不在列表中,则不应用加密
    if (includeStores.length > 0 && !includeStores.includes(store.$id)) {
      return;
    }

    // 从存储中读取并解密数据
    const loadEncryptedState = () => {
      const key = `pinia_${store.$id}`;
      const encryptedData = storage.getItem(key);

      if (encryptedData) {
        const decryptedData = decrypt(encryptedData);
        if (decryptedData) {
          store.$patch(decryptedData);
        } else {
          console.warn(`Failed to decrypt state for store: ${store.$id}`);
        }
      }
    };

    // 将数据加密并保存到存储
    const saveEncryptedState = () => {
      const key = `pinia_${store.$id}`;
      // 排除内部属性,只保存状态数据
      const state = { ...store.$state };
      const encryptedData = encrypt(state);
      storage.setItem(key, encryptedData);
    };

    // 初始化时加载解密后的状态
    loadEncryptedState();

    // 监听状态变化,自动加密保存
    store.$subscribe((mutation, state) => {
      saveEncryptedState();
    }, { deep: true });

    // 提供手动保存方法
    store.$encryptSave = saveEncryptedState;

    // 提供清除加密存储的方法
    store.$clearEncryptedStorage = () => {
      const key = `pinia_${store.$id}`;
      storage.removeItem(key);
    };
  };
}

实现说明

这个方案通过 Pinia 插件机制,将加密和解密逻辑与状态管理无缝集成:

  1. 插件工作流程

    • 初始化时,从存储中读取加密数据并解密,然后应用到对应的 store
    • 当状态发生变化时(通过 $subscribe 监听),自动将新状态加密后保存
    • 提供手动加密保存($encryptSave)和清除存储($clearEncryptedStorage)的方法
  2. 使用方式

    • 创建 store 时无需特殊处理,插件会自动对状态进行加密存储
    • 可以通过配置指定需要加密的 store(includeStores
    • 支持切换 localStorage 和 sessionStorage 存储方式
  3. 在组件中使用
    ```javascript
    import { useUserStore } from '@/store/userStore';

export default {
setup() {
const userStore = useUserStore();

// 登录时设置状态,会自动加密存储
const handleLogin = () => {
  userStore.login({
    username: 'test',
    token: 'secure-token'
  });
};

// 手动触发保存(一般不需要,状态变化会自动保存)
const manualSave = () => {
  userStore.$encryptSave();
};

// 清除存储的数据
const clearData = () => {
  userStore.$clearEncryptedStorage();
};

return { handleLogin, manualSave, clearData };

}
};
```

通过这种方式,所有需要保护的 Pinia 状态都会在本地存储时自动加密,读取时自动解密,既保证了数据安全性,又不影响正常的状态管理逻辑。

目录
相关文章
|
9天前
|
人工智能 运维 安全
|
7天前
|
人工智能 异构计算
敬请锁定《C位面对面》,洞察通用计算如何在AI时代持续赋能企业创新,助力业务发展!
敬请锁定《C位面对面》,洞察通用计算如何在AI时代持续赋能企业创新,助力业务发展!
|
8天前
|
机器学习/深度学习 人工智能 自然语言处理
B站开源IndexTTS2,用极致表现力颠覆听觉体验
在语音合成技术不断演进的背景下,早期版本的IndexTTS虽然在多场景应用中展现出良好的表现,但在情感表达的细腻度与时长控制的精准性方面仍存在提升空间。为了解决这些问题,并进一步推动零样本语音合成在实际场景中的落地能力,B站语音团队对模型架构与训练策略进行了深度优化,推出了全新一代语音合成模型——IndexTTS2 。
701 23
|
8天前
|
人工智能 测试技术 API
智能体(AI Agent)搭建全攻略:从概念到实践的终极指南
在人工智能浪潮中,智能体(AI Agent)正成为变革性技术。它们具备自主决策、环境感知、任务执行等能力,广泛应用于日常任务与商业流程。本文详解智能体概念、架构及七步搭建指南,助你打造专属智能体,迎接智能自动化新时代。
|
人工智能 数据可视化 数据挖掘
Quick BI 体验&征文有奖!
瓴羊生态推出Quick BI 征文激励计划,鼓励用户分享数据分析实践经验与技术洞察,征集高质量原创文章。内容围绕AI功能体验与BI案例实践,设季奖、年奖及参与奖,优秀作者可获现金奖励、产品内测资格及官方认证形象。投稿截止至2026年3月31日。
Quick BI 体验&征文有奖!