亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

vue-router結合vuex實現(xiàn)用戶權限控制功能

 更新時間:2019年11月14日 08:26:19   作者:genetalks_大數(shù)據(jù)  
這篇文章主要介紹了vue-router結合vuex實現(xiàn)用戶權限控制功能,本文給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下

為了實現(xiàn)前端校驗用戶,后端需要在用戶登錄的時候記錄下該用戶的狀態(tài)并加密之后返回給前端。之后該用戶的所有請求都應該附帶這個加密后的狀態(tài),后端取到這個狀態(tài)解密,并與之前保存的狀態(tài)對比,以此來判斷該用戶是否登錄或合法。

我這里使用了node簡單了寫了個本地的express服務,來實現(xiàn)上述功能。完整的代碼直接貼出來:

// server.js
const express = require('express');
const bodyParser = require('body-parser');
const jwt = require('jsonwebtoken');
const app = express();
// secret是后端加密的密鑰
const secret = 'rhwl';
app.use((req, res, next) => {
 res.header('Access-Control-Allow-Origin', '*');
 res.header('Access-Control-Allow-Methods', 'GET,HEAD,OPTIONS,POST,PUT');
 res.header('Access-Control-Allow-Headers', 'Origin, X-Requested-With, Content-Type, Accept, Authorization');
 if (req.method.toLowerCase() === 'options') {
  return res.end();
 }
 next();
});
app.use(bodyParser.json());
app.post('/login', (req, res) => {
 const { username } = req.body;
 if (username === 'admin') { // 如果是合法用戶,使用jwt進行加密生成token
  res.json({
   code: 0,
   username: 'admin',
   token: jwt.sign({ username: 'admin' }, secret, {
    expiresIn: 20,
   }),
  });
 } else {
  res.json({
   code: 1,
   data: '用戶名不存在',
  });
 }
});
app.get('/validate', (req, res) => {
 const token = req.headers.authorization; // 在請求頭中附帶token信息
 jwt.verify(token, secret, (err, decode) => { // 驗證token是否合法
  if (err) {
   return res.json({
    code: 1,
    data: '當前token無效',
   });
  }
  // 如果驗證合法,重新生成新的token,并返回信息
  res.json({
   username: decode.username,
   code: 0,
   token: jwt.sign({ username: 'admin' }, secret, {
    expiresIn: 20,
   }),
  });
 });
});
app.listen(3000, ()=>{
  console.log('服務器在3000端口運行');
});

2.項目中axios封裝

然后我們在項目中封裝符合自己需求的ajax請求,現(xiàn)在通常都是基于axios庫。在自己封裝的ajax插件中,要在每次的請求頭中添加上token。代碼實現(xiàn):

// ajaxResquest.js
import axios from 'axios';
class ajaxResquest {
  constructor(){
    // 根據(jù)當前模式自動切換baseURL
    this.baseURL = process.env.NODE_ENV === 'development' ? 'http://localhost:3000' : '/';
    this.timeout = 5000; // 設置請求超時為5s
  }
  request(config){
    const instance = axios.create({
      baseURL: this.baseURL,
      timeout: this.timeout,
    });
    instance.interceptor.request.use((config) => {
      // 將保存在本地的token添加到每次請求的請求頭中
      // 這樣就可以實現(xiàn)在請求時順帶附加用戶的校驗信息的需求
      config.headers.Authorization = localStorage.getItem('token');
      return config;
    }, (err) => {
      return Promise.reject(err);
    });
    instance.interceptor.response.use((req,res) => {
      return req.data;
    }, (err) => {
      Promise.reject(err);
    });
    // 將使用request時候需要的參數(shù)也添加到instance中
    return instance(config);
  }
}
export default new ajaxRequest();

然后統(tǒng)一管理項目api接口:

// api.js
import ajax from 'ajaxResquest';
export const userLogin = (username) => ajax.request({url: '/login', method: 'POST', data: {
  username,
}});
export const userValidate = () => ajax.request({url: '/validate'});

接下來我們在項目中具體實現(xiàn)用戶登陸和權限校驗的需求。

3.vuex記錄用戶登錄

先將登陸組件配合vuex使用來觸發(fā)用戶登陸的行為,并且將用戶登錄之后的信息保存在vuex中,登陸組件的代碼:

// userLogin component
<template>
  <div>
    <el-input style="width:200px" v-model="username"></el-input>
    <el-button @click="login">登錄</el-button>
  </div>
</template>
<script>
export default {
  data(){
    return {
      username: '',
    }
  },
  methods: {
    login(){
      // 這里觸發(fā)vuex中的actions,在vuex中調(diào)用用戶登陸接口
      // 從而將用戶登陸之后的狀態(tài)保存至vuex中
      this.$store.dispatch('login', this.username).then((data) => {
        // 登陸成功之后,路由跳轉至用戶賬戶頁或者進行你需要的操作
        this.$router.push('/profile');
      });
    }
  }
}
</script>

接著是vuex的store.js

// store.js
import Vue from 'vue';
import Vuex from 'vuex';
import {userLogin, userValidate} from 'api.js';
Vue.use(Vuex);
export default Vuex.store({
  state: {
    username: '', 
  },
  mutations: {
    setUsername(state, username){
      state.username = username;
    }
  },
  actions: {
    async login({commit}, username){
      const res = await userLogin(username);
      if (res.code === 1) { // 登錄失敗
        return Promise.reject(res);
      }
      // 登錄成功后將接口返回的token保存在本地
      localStorage.setItem('token', res.token);
      // 將用戶名保存在vuex中
      commit('setUsername', username);
    }
  }
});

經(jīng)過上面的操作,我們將用戶登錄中調(diào)用登錄接口的操作通過vuex實現(xiàn),將成功登錄后的用戶名保存在vuex中,此時的token保存在瀏覽器本地。但是vuex中的數(shù)據(jù)并不是持久數(shù)據(jù),刷新之后保存的用戶名就會消失,接下來我們實現(xiàn)刷新頁面或者路由跳轉時進行用戶校驗,如果驗證通過則會生成新的token和username并保存。

4.vuex配合vue-router實現(xiàn)登錄校驗

當用戶刷新頁面時,或者點擊其他頁面切換路由router時,需要調(diào)用后端的validate接口,該接口通過驗證已保存的token校驗當前用戶是否合法。我們在vuex的store.js中添加以下代碼:

export default Vuex.store({
  state: {
    username: '',
  },
  mutations: {
    setUsername(state, username){
      state.username = username;
    } 
  },
  actions: {
    async login({commit}, username){
      ...
    },
    async validate({commit}) {
      // 調(diào)用userValidate時,會將
      const res = await userValidate();
      if (res.code === 1) { // 此時用戶校驗失敗
        return Promise.reject(res);
      }
      // 如果校驗成功,重新保存token和username 
      localStorage.setItem('token', res.token);
      commit('setUsername', res.username);
    }
  }
});

基本上我們通過上面的代碼就實現(xiàn)了用戶權限控制所需要的所有前提操作:

  • 用戶成功登陸在本地保存token
  • 在自己封裝的ajax的請求頭部添加保存的token信息
  • 后端服務提供對前端token的校驗能力

那么接下來就就是路由router刷新或改變的時候如何進行權限控制了。

5.vue-router鉤子實現(xiàn)用戶權限控制

使用過vue-router的同學們都知道,路有也是有鉤子函數(shù)的,在官方文檔里面被稱為 導航守衛(wèi) 。導航守衛(wèi)允許我們可以精準的在每個路由變化的時候進行操作,我們就這里判斷用戶權限。在vue項目的的main.js中修改:

import Vue from 'vue';
import App from './App.vue';
import router from './router';
import store from './store';
import ElementUI from 'element-ui';
import 'element-ui/lib/theme-chalk/index.css';
// 在這里使用路由的導航守衛(wèi)進行權限控制
// 可以自定義不需要校驗用戶的路由白名單
const whiteList = ['/'];
router.beforeEach(async (to, from, next) => {
  // 要去的頁面是白名單,直接跳轉
  if (whiteList.includes(to.path)) {
    next();
  }
  // 不是白名單,調(diào)用vuex中的validate行為
  const flag = await store.dispatch('validate');
  if (flag) { // 用戶校驗通過,直接跳轉
    next();
  } else { // 用戶校驗失敗
    next('/login'); // 跳轉至用戶登陸頁
    // 順帶說一下,這里還可以在router中的meta屬性中添加isNeeded: true/false
    // 然后配合這個屬性更加精細的控制未通過用戶校驗時的頁面是否允許跳轉
  }
});
// vuex
Vue.use(ElementUI);
Vue.config.productionTip = false;
new Vue({
  router,
  store,
  render: h => h(App),
}).$mount('#app');

總結

以上所述是小編給大家介紹的vue-router結合vuex實現(xiàn)用戶權限控制,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!
如果你覺得本文對你有幫助,歡迎轉載,煩請注明出處,謝謝!

相關文章

  • 如何使用Vuex+Vue.js構建單頁應用

    如何使用Vuex+Vue.js構建單頁應用

    這篇文章主要教大家如何使用Vuex+Vue.js構建單頁應用,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-10-10
  • vue中el-tree結合el-switch實現(xiàn)開關狀態(tài)切換

    vue中el-tree結合el-switch實現(xiàn)開關狀態(tài)切換

    本文主要介紹了vue中el-tree結合el-switch實現(xiàn)開關狀態(tài)切換,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-12-12
  • vue實現(xiàn)驗證用戶名是否可用

    vue實現(xiàn)驗證用戶名是否可用

    這篇文章主要為大家詳細介紹了vue實現(xiàn)驗證用戶名是否可用,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-01-01
  • 解決vue項目中遇到 Cannot find module ‘chalk‘ 報錯的問題

    解決vue項目中遇到 Cannot find module ‘chalk‘ 報錯的問題

    這篇文章主要介紹了解決vue項目中遇到 Cannot find module ‘chalk‘ 報錯的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-11-11
  • vue 實現(xiàn)上傳組件

    vue 實現(xiàn)上傳組件

    雖然前端UI框架大都提供文件上傳的組件,以及很多插件可供選擇,工作中可能不需要我們手寫一個上傳組件,但是從零封裝組件對學習是很有助益的。下文為大家介紹使用Vue3+TypeScript實現(xiàn)的一個文件上傳的功能,目前只實現(xiàn)上傳等基本功能,后續(xù)會逐漸對功能進行擴展
    2021-05-05
  • vue異步加載dom元素之后無法獲得的解決

    vue異步加載dom元素之后無法獲得的解決

    這篇文章主要介紹了vue異步加載dom元素之后無法獲得的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-03-03
  • vue雙向數(shù)據(jù)綁定原理探究(附demo)

    vue雙向數(shù)據(jù)綁定原理探究(附demo)

    本文主要介紹了vue雙向數(shù)據(jù)綁定的原理,文章結尾附上完整demo下載。具有一定的參考價值,下面跟著小編一起來看下吧
    2017-01-01
  • 一文帶你簡單理解Vue的data為何只能是函數(shù)

    一文帶你簡單理解Vue的data為何只能是函數(shù)

    如果data是一個函數(shù)的話,這樣每復用一次組件,就會返回一份新的data,下面這篇文章主要給大家介紹了關于簡單理解Vue的data為啥只能是函數(shù)的相關資料,需要的朋友可以參考下
    2022-10-10
  • uniapp微信小程序axios庫的封裝及使用詳細教程

    uniapp微信小程序axios庫的封裝及使用詳細教程

    這篇文章主要給大家介紹了關于uniapp微信小程序axios庫的封裝及使用的相關資料,Axios是一個基于promise網(wǎng)絡請求庫,作用于node.js和瀏覽器中axios-miniprogram-adapteraxios的小程序適配器,需要的朋友可以參考下
    2023-08-08
  • vue 虛擬DOM快速入門

    vue 虛擬DOM快速入門

    這篇文章主要介紹了vue 虛擬DOM的相關資料,幫助大家更好的理解和學習使用vue框架,感興趣的朋友可以了解下
    2021-04-04

最新評論