Vue+Express實現登陸狀態權限控制

前提須知

  • 對Vue全家桶有基本的認知.
  • 擁有node環境
  • 瞭解express
  • 本篇只是介紹登陸狀態的權限驗證,以及登陸,註銷的先後端http交互.前端佈局,後端密碼驗證等之後有時間再對這些內容進行補充.

一丶業務分析

1.什麼狀況下進行權限驗證?

  • 訪問敏感接口
    • 前端向後端敏感接口發送ajax
    • 後端進行session驗證,並返回信息
    • 前端axios攔截返回信息,根據返回信息進行操做
  • 進行頁面切換
    • 頁面切換,觸發vue-router的路由守衛
    • 路由守衛根據跳轉地址進行驗證,如需權限,則發送ajax至後端驗證接口
    • 後端驗證接口進行session驗證,返回信息
    • 前端根據後端返回信息進行操做

2.先後端進行了怎麼的交互?

  • 登陸
  • 註銷

腦圖

二丶項目環境

三丶項目開始前

1.建立項目目錄,配置路由,建立頁面跳轉組件

  • 項目目錄:
    • 建立components/route_list.vue進行頁面跳轉
<template>
    <div>
      <p><router-link :to="{name:'index'}">主頁</router-link></p>
      <p><router-link :to="{name:'login'}">登陸</router-link></p>
      <p><router-link :to="{name:'logout'}">註銷</router-link></p>
      <p><router-link :to="{name:'me'}">我的信息</router-link></p>
      <p>登陸狀態:{{this.$store.state.me.login}}</p>
    </div>
 </template>
複製代碼
  • 建立stores/me.js倉庫,存放登陸狀態
import Vue from 'vue'
import router from '../router';
export default{
    namespaced:true,
    state:{
        login :false
    },
    mutations:{
        changeLogin(state,{result}){ 
            state.login = result;
        }
    },
    actions:{
        async checkMe({commit}){
            const result = await Vue.prototype.$http.get('/me').then(data=>data.data);
            if(!result){
                router.push({name:'login'})
                return
            }
            commit('changeLogin',{result})
        }
    }
}
複製代碼
  • views中 新建Login,Logout,Signin,me組件
  • 路由信息寫在router.js中
  • 2.配置路由: 引入各個頁面,進行路由跳轉配置

後端配置express-session

//serve/app.js文件  express服務器  
const express = require('express')
//中間件--用於下發session
const session = require('express-session')
const app = express()

//使用express-session下發session
app.set('trust proxy', 1)
app.use(session({
  secret: 'keyboard cat',
  resave: false,
  saveUninitialized: true,
}))

複製代碼

四丶權限驗證 - 敏感接口

1.主頁Index.vue--訪問敏感接口,展現敏感接口數據

<template>
    <div>
        //請求後臺數據
        <Button @click="getTest">敏感接口</Button>
        //請求信息展現
        {{result}}
        //頁面跳轉組件
      <route_list></route_list>
    </div>
</template>

<script>
import route_list from '../components/route_list'
    export default {
        components:{
            route_list
        },
        data(){
            return{
                result:""
            }
        },
        methods:{
        //請求敏感接口
         async getTest(){
             this.result = await this.$http.get("/").then(res=>res.data)
          }
        }
    }
</script>
複製代碼

2.後端的敏感接口接收到請求,進行判斷

app.get('/', function (req, res) {
  if(req.session.login){
    res.send("hello world")
  }else{
  res.send(403)
  }
})
複製代碼

3.axios--發送ajax後,對後端返回數據進行攔截,判斷

import axios from 'axios';
import url from 'url';
import router from '../src/router'
//建立axios實例
var instance = axios.create({
    baseURL: '/api'
});

//攔截器
 instance.interceptors.response.use(
    function(response){
        return response;
    },function(error){
        //敏感接口.若是沒有session跳轉登陸界面
        if(error.response.status==403){
            router.push({name:"login"})
        }
    }) 

export default instance;
複製代碼

若是返回結果爲true,登陸狀態,就能夠進行訪問敏感接口了.前端

五丶權限驗證 - 頁面跳轉

1.路由守衛,對跳轉頁面進行監視

//路由守衛
   router.beforeEach((to,from,next)=>{
  if(to.name != 'login' && to.name != 'index'){
    store.dispatch('me/checkMe')
  }
   next()
})
複製代碼

2.store中checkme,當跳轉敏感頁面時進行驗證

actions:{
        async checkMe({commit}){
            //請求/me接口,對登陸信息進行判斷,並保留狀態
            const result = await Vue.prototype.$http.get('/me').then(data=>data.data);
            //返回值爲false,跳轉至login
            if(!result){
                router.push({name:'login'})
                return
            }
            commit('changeLogin',{result})
        }
    }
複製代碼

3.後端的檢測登陸接口接收到請求,進行判斷

//驗證是否登陸
app.get('/me', function (req, res) { 
//判斷session是否爲true
  if(req.session.login){
    res.send(true)
  }else{
    res.send(false)
  }
})
複製代碼

若是返回結果爲true,登陸狀態,就能夠進行頁面跳轉了.vue

六丶登陸

1.登陸頁Login.vue - 請求登陸接口,登陸成功後將信息保存到store

<template>
    <div>
<h1>登陸</h1>
<Button @click="login">登陸</Button>
<route_list></route_list>
    </div>
</template>

<script>
import route_list from '../components/route_list'
    export default {
        components:{
            route_list
        },
      methods:{
         async login(){
         //請求登陸接口
            const result = await this.$http.get("/login").then(data=>data.data);
            //記錄登陸狀態
            this.$store.commit('me/changeLogin',{result})
          }
        },
}
</script>
複製代碼

2.後端登陸接口接收到請求,生成session

//登陸接口,更改session狀態
app.get('/login', function (req, res) { 
  req.session.login = true,
  res.send(true)
})
複製代碼

如今就是登陸狀態了node

七丶註銷

1.登陸頁Logout.vue - 請求註銷接口,註銷成功後將信息保存到store

<template>
    <div>
        <h1>註銷</h1>
<Button @click="login">註銷</Button>
<route_list></route_list>
    </div>
</template>
<script>
import route_list from '../components/route_list'
    export default {
        components:{
            route_list
        },
    data(){
        return{
           
        }
    },
      methods:{
         async login(){
            const result = await this.$http.get("/logout").then(data=>data.data);
            this.$store.commit('me/changeLogin',{result})
          }
        },
        
}
</script>

複製代碼

2.後端註銷接口接收到請求,更改session狀態

//登陸接口,更改session狀態
app.get('/login', function (req, res) { 
  req.session.login = false,
  res.send(false)
})
複製代碼

如今就是註銷狀態了ios

完成展現(gif,可能加載不出來):

done

Demo完成後的github源碼:有興趣的能夠點擊直接下載執行

相關文章
相關標籤/搜索