5.登录验证,重定向及访问限制

项目地址

github地址、 码云地址

接上一篇,已经配置好了对应的页面及路由,整体逻辑就是在需要登录的页面(已经在meta中有needlogin属性)未登录无法访问,登陆页面在登录后无法访问,登录后跳转到原始访问的地址

登录页面

启动服务,通过路由手动进入登录页(目前为空白页)

image.png

登陆页面布局与登陆接口调用
//  html
<template>
  <div class="admin-login-container flex_center_center">
    <div class="admin-login-form">
      <h3>管理后台模板</h3>
      <el-form :model="loginForm" :rules="loginRules" ref="loginRuleForm" label-width="80px">
        <el-form-item label="用户名" prop="username">
          <el-input v-model="loginForm.username"></el-input>
        </el-form-item>
        <el-form-item label="密码" prop="password">
          <el-input type="password" v-model="loginForm.password"></el-input>
        </el-form-item>
        <el-form-item>
          <el-button type="primary" @click="submitLoginForm('loginRuleForm')">登录</el-button>
          <el-button @click="resetLoginForm('loginRuleForm')">重置</el-button>
        </el-form-item>
      </el-form>
    </div>
  </div>
</template>
//  js
import { login } from "@/api/user";
export default {
  data() {
    return {
      //登录表单
      loginForm: {},
      //登录验证
      loginRules: {
        username: [
          {
            required: true,
            message: "请输入用户名",
            trigger: "blur"
          },
          { min: 3, max: 8, message: "长度在 3 到 8 个字符", trigger: "blur" }
        ],
        password: [{ required: true, message: "请输入密码", trigger: "blur" }]
      }
    };
  },
  methods: {
    //提交登录
    async submitLoginForm(form) {
      this.$refs[form].validate(async valid => {
        if (valid) {
          let res = await login(this.loginForm);
          if (res) {
            this.$message({
              message: "登录成功",
              type: "success"
            });
            this.$store.dispatch("setToken", res.token);
            this.$route.query.redirect
              ? this.$router.push(this.$route.query.redirect)
              : this.$router.push({ name: "Home" });
          }
        }
      });
    },
    //重置
    resetLoginForm(form) {
      this.$refs[form].resetFields();
    }
  }
};
//  css
.admin-login-container {
  height: 100%;
  background: #f6f6f6;
  .admin-login-form {
    width: 350px;
    padding: 20px;
    background: #fff;
    border-radius: 10px;
    text-align: center;
  }
}
方便起见引入全局css样式 上下左右居中
//  src/style/index.css
/* flex */
.flex_center_center {
  display: flex;
  justify-content: center;
  align-items: center;
}
此时打开登陆页面 如下图

登陆页面

这里登陆接口的服务端逻辑是在easy-mock中写的 账号:rty 密码:123,只是做一个简单的验证,可以直接调我的接口,也可以自己写验证密码的模拟逻辑,下图是我写的登陆接口逻辑 ,具体方法可以参考easy-mock文档

easy-mock登陆逻辑

登陆验证、重定向及限制访问

1.未登陆用户只能访问登陆、404页面,不能访问其他需要登陆权限的页面 2.在当前页面退出登陆后,再次登陆回重定向到之前的页面 3.已经登陆用户不能重复访问登陆页面 4.路由切换会验证用户登陆状态,为登陆会返回到登陆页

//  src/permission.js
import router from "./router";
import Storage from "@/tools/storage";
//progress
import Progress from "nprogress";
import "nprogress/nprogress.css";

router.beforeEach((to, from, next) => {
  Progress.start();
  if (to.matched.some(res => res.meta.needLogin && !Storage.get("token"))) {
    next({
      path: "/login",
      //将原生的跳转地址当作参数传入,后续登录成功之后,需要跳转到原始访问的地址
      query: { redirect: to.path }
    });
    Progress.done();
    return;
  }
  //登录状态下,不允许回退到登录页面
  if (to.path === "/login" && Storage.get("token")) {
    next(false);
    Progress.done();
    return;
  }
  next();
  Progress.done();
});

router.afterEach(() => {
  Progress.done(); // 结束Progress
});

全局引入登陆权限控制

//  src/main.js
import "@/permission";
最终效果预览

效果预览

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏云知识学习

FTP配置文件诠释

在/etc/vsftpd.conf(或在/etc/vsftpd/vsftpd.conf)配置文件中添加如下几项:

6268
来自专栏iOSDevLog

iOS打包framework - Swift完整项目打包Framework,嵌入OC项目使用

--------------------------------打包篇-------------------------------****

1484
来自专栏Porschev[钟慰]的专栏

Nodejs学习笔记(一)--- 简介及安装Node.js开发环境

学习资料   1.深入浅出Node.js http://www.infoq.com/cn/minibooks/nodejs   2.Node.js开发指南 简介...

3366
来自专栏开源优测

[快学Python3]开发工具

Python有丰富的开发工具,本书不一一进行介绍,只推荐大家使用PyCharm,本书接下来章节的示例代码均基于PyCharm社区版进行演示。 下载 下载地址: ...

3287
来自专栏hotqin888的专栏

beego利用casbin进行权限管理——第一节 起步、测试

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/hotqin888/article/det...

3041
来自专栏GuZhenYin

ASP.NET Core使用静态文件、目录游览与MIME类型管理

前言 今天我们来了解了解ASP.NET Core中的静态文件的处理方式. 以前我们寄宿在IIS中的时候,很多静态文件的过滤 和相关的安全措施 都已经帮我们处理好...

33710
来自专栏跟着阿笨一起玩NET

通过SvcUtil.exe生成客户端代码和配置

WCF服务调用通过两种常用的方式:一种是借助代码生成工具SvcUtil.exe或者添加服务引用的方式,一种是通过ChannelFactory直接创建服务代理对象...

862
来自专栏Vamei实验室

Linux进程基础

计算机实际上可以做的事情实质上非常简单,比如计算两个数的和,再比如在内存中寻找到某个地址等等。这些最基础的计算机动作被称为指令 (instruction)。所谓...

2145
来自专栏云知识学习

关于FTP搭建问题

1. 匿名服务器的连接(独立的服务器) 在/etc/vsftpd.conf(或在/etc/vsftpd/vsftpd.conf)配置文件中添加如下几项: A...

66610
来自专栏葡萄城控件技术团队

LeadTools Android 入门教学——运行第一个Android Demo

LeadTools 有很多Windows平台下的Demo,非常全面,但是目前开发手机应用的趋势也越来越明显,LeadTools也给大家提供了10个Android...

1965

扫码关注云+社区

领取腾讯云代金券