【Koa】(用实例带你一步步理解):实现不同用户只能访问特定的页面--谈谈Koa的中间件Middleware

本文通过一个实例展示了如何使用 Koa 的中间件功能实现用户登录验证及权限控制。首先,创建了 login.js 中间件检查用户是否登录,未登录用户将被重定向到登录页面。然后,在 auth.js 中间件中,判断用户是否为特定用户(如 tom),只有特定用户才能访问特定页面。通过这两个中间件的组合使用,实现了用户登录状态的校验和权限页面的访问控制。
摘要由CSDN通过智能技术生成

前言

此例子主要实现的效果:
1.没有进行账号密码的验证是无法正常跳转到其他页面
2.不同的用户登录之后所访问的页面是不同的,即用户A登录之后可以访问userlist页面;而用户B登录之后是无权限访问userlist页面。

在实际应用中我们常常会碰到类似这样的例子,例:我们每个人在同一登录页面登录之后所跳转的个人页面是包含自己个人信息的页面,而不是包含张三或李四个人信息的页面。

想要实现上面的效果,我们就需要用到koa的中间件Middleware来进行页面跳转的用户判断、“拦截”。

一、效果图1与代码实现

用户没有进行账号密码的验证就手动输入路由去访问特定的页面(不可行),会自动帮你跳转到登录页面,引导用户要先进行账号密码的验证才能实行其他操作

在这里插入图片描述

步骤

1.需另新建一个Middlewares文件夹来放不同的Middleware中间件

在这里插入图片描述

//login.js
module.exports = {
    loginstats:async(ctx,next)=>{
    //判断是否有name值
        if(!ctx.session.name){
            ctx.response.redirect("/users/login");
        }else{
            await next();
        }
    }
}

2.在user.js文件导入所定义好的中间件

在这里插入图片描述

//users.js
const loginMiddleware = require("../../middlewares/login")
//users.js
router.prefix('/users')

router.get('/login', async (ctx, next) => {
  await ctx.render('login', {
  })
})

router.post('/checklogin', async (ctx, next) => {
  let {username,password} = ctx.request.body;
  if(username == 'tom' && password == '123'){
    // ctx.body = {success:true,msg="登陆成功"}
    ctx.session.name = username;
    ctx.response.redirect("/users/userinfo")
  }else if(username == 'jack' && password == '123'){
    ctx.session.name = username;
    ctx.response.redirect("/users/userinfo")
  }else{
    // ctx.body = {success:false,msg="账户密码错误"}
  }
})


//在此处插入Middleware中间件,调用刚刚导入的login.js来判断用户是否已成功登录,
//若没有则不能会跳转到用户登录页面,而不是继续往下执行。
router.all('*',loginMiddleware.loginstats)

router.get('/userinfo', async (ctx, next) => {
  await ctx.render('users/userinfo', {
    message:"登录成功",
    name:" "+ctx.session.name
  })
})

二、效果图2与代码实现

当用户tom输入账号和密码登录成功之后,手动输入访问userlist页面的路由可正常访问userlist页面

在这里插入图片描述

跳转userinfo页面

在这里插入图片描述

此时当用户tom输入userlist路由,想访问userlist页面是成功的

在这里插入图片描述

若是jack用户登录之后想要访问userlist页面则是失败的,无权限的

在这里插入图片描述
在这里插入图片描述

用户jack输入访问userlist页面的路由,由于被设定无法访问,则跳转一个“无权限访问”的页面

在这里插入图片描述

步骤

1.同样需要定义好另一个Middleware中间件

在这里插入图片描述

//auth.js
module.exports = {
    checkauth:async(ctx,next)=>{
    //判断用户如果不是tom,则会跳转到nopath页面,如果是tom,则正常往下执行。
        if(ctx.session.name != 'tom'){
            ctx.response.redirect("/users/nopath");
        }else{
            await next();
        }
    }
}

2.导入刚刚定义好的中间件

//users.js
const authMiddleware = require("../../middlewares/auth")
router.prefix('/users')

router.get('/login', async (ctx, next) => {
  await ctx.render('login', {
  })
})

router.post('/checklogin', async (ctx, next) => {
  let {username,password} = ctx.request.body;
  if(username == 'tom' && password == '123'){
    // ctx.body = {success:true,msg="登陆成功"}
    ctx.session.name = username;
    ctx.response.redirect("/users/userinfo")
  }else if(username == 'jack' && password == '123'){
    ctx.session.name = username;
    ctx.response.redirect("/users/userinfo")
  }else{
    // ctx.body = {success:false,msg="账户密码错误"}
  }
})

router.all('*',loginMiddleware.loginstats)

router.get('/userinfo', async (ctx, next) => {
  await ctx.render('users/userinfo', {
    message:"登录成功",
    name:" "+ctx.session.name
  })
})
router.get('/nopath', async (ctx, next) => {
  await ctx.render('nopath', {
    message:"无权限访问"
  })
})

//在此处插入Middleware中间件,调用刚刚导入的auth.js来判断用户是否是tom,
//若不是tom则手动输入userlist页面路由是不能实现正常访问的,是会跳转到nopath页面。
//若是tom,则会正常往下执行,即访问userlist页面。
router.all('*',authMiddleware.checkauth)

router.get('/userlist', async (ctx, next) => {
  await ctx.render('users/userlist', {
  })
})

总结

举此例子,简单地来说,Koa的Middleware中间件可用于设定不同用户访问特定的页面。
步骤提炼:定义中间件并导出=>引入中间件=>使用中间件

以上是我个人学习这块知识的个人理解,如有错误,请评论区提出批评指正!多多指教!
今后会继续分享关于Vue.js、Node.js等知识干货,大家一起交流学习~

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值