koa使用koa-passport實現路由進入前登陸驗證

如今的項目需求很簡單,當進入一個頁面的時候,若是沒登陸,則跳轉到登陸頁面,若是登陸了則直接到對應頁面。mongodb

koa2寫的項目,使用koa-passport,koa-session,根據koa-passport的segmentfault

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:session

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

passport.js:koa

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

 

 

問題:目前用async

isAuthenticated()來判斷是否登陸只會在單個路由中分別判斷,想問下你們有沒有辦法能夠把這個判斷是否登陸的方法集成成一個方法,而後每一個路由去使用。歡迎你們留言!
相關文章
相關標籤/搜索