zoukankan      html  css  js  c++  java
  • koa使用koa-passport实现路由进入前登录验证

    现在的项目需求很简单,当进入一个页面的时候,如果没登录,则跳转到登录页面,如果登录了则直接到对应页面。

    koa2写的项目,使用koa-passport,koa-session,根据koa-passport的

    isAuthenticated()来判断是否登录。

    这篇文章写的很好:===》https://segmentfault.com/a/1190000011557953

    我的其中一个路由代码;
    controllers:
    exports.renderUserList = async (ctx, next) => {
        if (ctx.isAuthenticated()) {
            console.log(ctx.state.user)
            console.log(ctx)
            let data = await userDao.userList()
            await ctx.render('userList', {
                title: '员工列表',
                csrf: ctx.csrf,
                data: data
            })
        }else {
            ctx.redirect('/login')
        }
    }

    router.js:

    router.get('/userList', User.renderUserList)

    passport.js:

    const passport = require('koa-passport')
    const User = require('../models/user')
    const log4js = require('koa-log4')
    const logger = log4js.getLogger('passport')
    const LocalStrategy = require('passport-local').Strategy
    const md5 = require('md5')
    
    passport.use(new LocalStrategy(
        /**
         * @param username 用户输入的用户名
         * @param password 用户输入的密码
         * @param done 验证验证完成后的回调函数,由passport调用
         */
        function (username, password, done) {
            User.findOne({username: username},function (err,result) {
                if (result !== null) {
                    if (result.password === md5(password)) {
                        return done(null, doPassword(result),'登录成功')
                    } else {
                        return done(null, false, '密码错误')
                    }
                } else {
                    return done(null, false, '用户不存在')
                }
            }).catch(function (err) {
                logger.error(err.message)
                return done(null, false, {message: err.message})
            })
        }
    ))
    
    // serializeUser 在用户登录验证成功以后将会把用户的数据存储到 session 中
    passport.serializeUser(function (user, done) {
        done(null, user)
    })
    
    // deserializeUser 在每次请求的时候将从 mongodb 中读取用户对象
    passport.deserializeUser(function (id, done) {
        console.log(id)
        User.findById(id, function (err, user) {
            done(err, doPassword(user))
        })
        // done(null, user)
    })
    
    //隐藏密码,相当于是去掉密码的用户信息保存在session里
    function doPassword(user) {
        if(user) {
            user.password = ''
            return user
        } else {
            return null
        }
    }
    
    module.exports = passport

    问题:目前用

    isAuthenticated()来判断是否登录只会在单个路由中分别判断,想问下大家有没有办法可以把这个判断是否登录的方法集成成一个方法,然后每个路由去使用。欢迎大家留言!
  • 相关阅读:
    软件开发规范
    内置模块
    自定义模块
    装饰器 递归
    内置函数 闭包
    生成器 推导式
    函数名运用 新版格式化输出 迭代器
    函数进阶
    pycharm快捷键
    移动端必测点
  • 原文地址:https://www.cnblogs.com/beileixinqing/p/9088890.html
Copyright © 2011-2022 走看看