You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Nuxt项目中将JWT解码后的数据存储到Vuex中

实现步骤

1. 首先创建Vuex的auth状态模块

在Nuxt项目的store目录下新建auth.js文件,代码如下:

export const state = () => ({
  isAuthenticated: false,
  userInfo: {
    roles: [],
    // 可自行扩展其他需要从JWT中提取的字段,比如用户名、用户ID等
  }
})

export const mutations = {
  // 存储用户认证信息
  SET_AUTH(state, userData) {
    state.isAuthenticated = true
    state.userInfo = userData
  },
  // 清空认证信息
  CLEAR_AUTH(state) {
    state.isAuthenticated = false
    state.userInfo = { roles: [] }
  }
}

2. 修改现有auth.js逻辑,对接Vuex

建议把现有auth.js改为Nuxt插件,这样可以直接获取到$store实例,修改后的完整代码如下:

import axios from "axios";
import jwtDecode from "jwt-decode";

// 封装为Nuxt插件,注入到全局实例
export default ({ store }, inject) => {
  const auth = {
    login: async (data) => {
      const token = await axios
        .post(process.env.baseUrl + 'login_check', data)
        .then(response => response.data.token)

      window.localStorage.setItem("authToken", token)
      axios.defaults.headers["Authorization"] = "Bearer " + token;
      
      // 解码JWT获取用户数据存入Vuex
      const jwtData = jwtDecode(token)
      store.commit('auth/SET_AUTH', jwtData)
    },

    logout: () => {
      window.localStorage.removeItem("authToken")
      delete axios.defaults.headers['Authorization'];
      // 清空Vuex存储的用户数据
      store.commit('auth/CLEAR_AUTH')
    },

    verifToken: () => {
      const token = window.localStorage.getItem("authToken");
      if (token) {
        const jwtData = jwtDecode(token);
        if (jwtData.exp * 1000 > new Date().getTime()) {
          axios.defaults.headers["Authorization"] = "Bearer " + token;
          // 页面刷新/初始化时重新写入用户数据到Vuex
          store.commit('auth/SET_AUTH', jwtData)
          return true
        } else {
          this.logout();
        }
      } else {
        this.logout();
        console.log("no token")
      }
      return false
    }
  }
  // 全局注入$auth方法,页面中可直接通过this.$auth调用相关接口
  inject('auth', auth)
}

之后到nuxt.config.js中注册这个插件:

export default {
  // 其他配置项
  plugins: [
    '~/path/to/your/auth.js' // 替换为你实际的auth.js文件存放路径
  ]
}

3. 页面中使用存储的角色信息

你可以在任意页面/组件中直接从Vuex读取角色信息,控制内容展示:

<template>
  <div>
    <!-- 仅管理员可见的内容 -->
    <div v-if="$store.state.auth.userInfo.roles.includes('ROLE_ADMIN')">
      管理员专属操作区
    </div>
    <!-- 所有登录用户可见的内容 -->
    <div v-if="$store.state.auth.isAuthenticated">
      普通用户可见内容
    </div>
  </div>
</template>

补充说明

如果你的Symfony JWT返回的角色字段不是默认的roles,或者需要自定义存储的字段,修改SET_AUTH传入的参数即可。另外建议在全局布局文件或者路由中间件中初始化时调用一次$auth.verifToken(),避免页面刷新后Vuex的用户数据丢失。

内容的提问来源于stack exchange,提问作者chtouk

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 18:18:05