前提须知

  • 对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,登录状态,就可以进行页面跳转了.

六丶登录

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)
})
复制代码

现在就是登录状态了

七丶注销

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)
})
复制代码

现在就是注销状态了

完成展示(gif,可能加载不出来):

Vue+Express实现登录状态权限控制的更多相关文章

  1. 手工搭建基于ABP的框架(3) - 登录,权限控制与日志

    为了防止不提供原网址的转载,特在这里加上原文链接: http://www.cnblogs.com/skabyy/p/7695258.html 本篇将实现登录.权限控制.日志配置与审计日志的功能.首先我 ...

  2. Token认证登录以及权限控制

    IdentityServer4实现Token认证登录以及权限控制   相关知识点 不再对IdentityServer4做相关介绍,博客园上已经有人出了相关的系列文章,不了解的可以看一下: 蟋蟀大神的: ...

  3. pc vue 项目中的菜单权限控制

    在pc 管理系统这种类型的产品,通常会涉及到账号权限的控制,不同的账号权限能浏览的功能模块是不同的,对应侧边栏菜单模块的显示也会不同. 场景一.(电商类管理系统) 登录 登录后,依次获取账号 toke ...

  4. .net core 同时实现网站管理员后台、会员、WebApi登录及权限控制

    我们在开网站信息系统时,常常有这样几个角色,如后台的管理员,前台的会员,以及我们各种应用的WebAPI 都需要进行登录操作及权限控制,那么在.net core如何进行设计呢. 首先我使用的是.net ...

  5. OAuth2.0 原理流程及其单点登录和权限控制

    2018年07月26日 07:21:58 kefeng-wang 阅读数:5468更多 所属专栏: Java微服务构架   版权声明:[自由转载-非商用-非衍生-保持署名]-转载请标明作者和出处. h ...

  6. Vue——路由:登录状态的判断

    在搭建的系统中,最基本的登录都是必须的,结合Vue的路由,涉及最多的就是登录状态的判断.也就是说,如果一个组件要校验登录状态,则在用户初始进入时,就要去判断用户是否登录,这里的校验登录状态就是本篇的重 ...

  7. Spring+MyBatis实践—登录和权限控制

    1.实现用户登录功能: 通过session来实现用户登录功能.在用户登录时,将用户的相关信息放在HttpSession对象用,其中HttpSession对象可以通过HttpServletRequest ...

  8. 学习MVC之租房网站(六)-用户登录和权限控制

    在上一篇<学习MVC之租房网站(五)-权限.角色.用户管理>完成了权限.角色.用户的增删改查,现在将基于前面完成的内容,进行后台用户登录和权限控制功能的开发. 一.用户登录 用户登录涉及到 ...

  9. IdentityServer4实现Token认证登录以及权限控制

    相关知识点 不再对IdentityServer4做相关介绍,博客园上已经有人出了相关的系列文章,不了解的可以看一下: 蟋蟀大神的:小菜学习编程-IdentityServer4 晓晨Master:Ide ...

随机推荐

  1. mysql 某表某列支持 emoji

    ALTER TABLE `customer_user` MODIFY COLUMN `UserName`  varchar(30) CHARACTER SET utf8mb4 COLLATE utf8 ...

  2. [LeetCode] 202. Happy Number 快乐数

    Write an algorithm to determine if a number is "happy". A happy number is a number defined ...

  3. [LeetCode] 262. Trips and Users 旅行和用户

    The Trips table holds all taxi trips. Each trip has a unique Id, while Client_Id and Driver_Id are b ...

  4. [LeetCode] 361. Bomb Enemy 炸敌人

    Given a 2D grid, each cell is either a wall 'W', an enemy 'E' or empty '0' (the number zero), return ...

  5. 解决在manjaro下,vscode无法将chrome作为默认浏览器打开

    Same issue. The solution is simple. Find the name of the exec command, for google chrome in arch lin ...

  6. Saltack 针对用户进行权限控制

    一. client_acl 配置使用 1.1 client_acl概述 开启对系统上非root的系统用户在master上执行特殊的模块,这些模块名可以使用正则表达式进行表示,不能指定对那些minion ...

  7. php_mvc实现步骤八

    shop34-10-框架类 框架类(框架初始化类) 将原来入口文件中功能,放在该类中完成,入口文件变得简单,轻量! 将入口文件中的各个功能,由框架类的各个方法,完成: 为了简单化,使用纯静态的类.(看 ...

  8. PostgreSQL的参数优化

    硬件和软件信息 CPU: Intel(R) Xeon(R) CPU E5-2683 v3 @ 2.00GHz 2 sockets / 28 cores / 56 threads内存: 256GB of ...

  9. 如何使用websocket实现前后端通信

    websocket通信是很好玩的,也很有用的的通信方式,使用方式如下: 第一步由于springboot很好地集成了websocket,所以先在在pom.xml文件中引入依赖 <dependenc ...

  10. 使用Spring CROS解决项目中的跨域问题

    CROS(Cross-Origin Resource Sharing) 用于解决浏览器中跨域请求的问题.简单的Get请求可以使用JSONP来解决,而对于其它复杂的请求则需要后端应用的支持CROS.Sp ...