在构建SPA(单页应用程序)时,用户权限控制是非常关键的一个环节。Vue.js生态中的vue-router和vuex可以帮助我们实现这一功能。本文将详细介绍如何结合这两个库,以及与后端服务交互,实现用户权限控制。 后端服务需要在用户登录时生成一个加密的令牌(Token)。这里使用了Node.js的Express框架和JWT(JSON Web Token)库。JWT是一种轻量级的身份认证机制,它通过加密数据来传递用户信息。在示例中,当用户成功登录(例如用户名为"admin"),服务器会生成一个带有用户名的JWT,并返回给前端。这个Token的有效期设置为20分钟。 ```javascript // server.js const jwt = require('jsonwebtoken'); const secret = 'rhwl'; app.post('/login', (req, res) => { const { username } = req.body; if (username === 'admin') { res.json({ code: 0, username: 'admin', token: jwt.sign({ username: 'admin' }, secret, { expiresIn: 20, // 有效期20分钟 }), }); } else { res.json({ code: 1, data: '用户名不存在' }); } }); app.get('/validate', (req, res) => { const token = req.headers.authorization; jwt.verify(token, secret, (err, decode) => { if (err) { res.json({ code: 1, data: '当前token无效' }); } else { res.json({ username: decode.username, code: 0, token: jwt.sign({ username: 'admin' }, secret, { expiresIn: 20, }), }); } }); }); ``` 前端应用通常使用axios作为HTTP客户端,我们需要对axios进行封装,以便在每个请求中自动添加Token。这可以通过创建一个axios实例并在配置中设置请求头实现: ```javascript // ajaxRequest.js import axios from 'axios'; class AjaxRequest { constructor() { this.baseURL = process.env.NODE_ENV === 'development' ? 'http://localhost:3000' : '/'; this.timeout = 5000; } request(config) { const instance = axios.create({ baseURL: this.baseURL, timeout: this.timeout, }); // 在请求拦截器中添加Token instance.interceptors.request.use( (config) => { // 从vuex的store中获取Token const token = store.state.token; if (token) { config.headers.Authorization = `Bearer ${token}`; } return config; }, (error) => Promise.reject(error) ); return instance(config); } } export default new AjaxRequest(); ``` 接下来,我们将使用vuex来管理用户登录状态和Token。在vuex的store中,我们可以创建一个module来处理用户登录、登出和Token的获取与存储: ```javascript // store/user.js import Vue from 'vue'; import Vuex from 'vuex'; import axios from './ajaxRequest'; Vue.use(Vuex); export default new Vuex.Store({ state: { token: null, username: null, }, mutations: { SET_TOKEN(state, token) { state.token = token; }, SET_USERNAME(state, username) { state.username = username; }, }, actions: { async login({ commit }, credentials) { const response = await axios.post('/login', credentials); if (response.data.code === 0) { commit('SET_TOKEN', response.data.token); commit('SET_USERNAME', response.data.username); } }, logout({ commit }) { commit('SET_TOKEN', null); commit('SET_USERNAME', null); }, }, }); ``` 在vue-router中,我们可以利用路由守卫(beforeEach)来实现权限控制。在用户尝试访问受保护的路由之前,检查vuex store中的Token是否有效。如果Token无效,重定向到登录页面: ```javascript // router/index.js import Vue from 'vue'; import Router from 'vue-router'; import Home from '@/views/Home.vue'; import Login from '@/views/Login.vue'; import store from '@/store'; Vue.use(Router); const router = new Router({ routes: [ { path: '/', name: 'home', component: Home, meta: { requiresAuth: true } }, { path: '/login', name: 'login', component: Login }, ], }); router.beforeEach((to, from, next) => { if (to.meta.requiresAuth && !store.state.token) { next('/login'); } else { next(); } }); export default router; ``` 至此,我们已经实现了基本的用户权限控制。当用户登录时,后端会返回一个Token,前端将其存储在vuex中,并在每次请求时自动添加到请求头。同时,vue-router会检查用户是否已登录,如果没有,将不允许访问受保护的路由。 然而,实际项目中可能还需要考虑更多细节,如Token刷新、权限角色管理、错误处理等。这只是一个基础示例,帮助理解如何在Vue.js应用中结合vue-router和vuex实现用户权限控制。在实际开发中,应根据项目需求进一步完善和扩展。
- 粉丝: 5
- 资源: 922
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助