現在的項目需求很簡單,當進入一個頁面的時候,如果沒登錄,則跳轉到登錄頁面,如果登錄了則直接到對應頁面。
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()來判斷是否登錄只會在單個路由中分別判斷,想問下大家有沒有辦法可以把這個判斷是否登錄的方法集成成一個方法,然后每個路由去使用。歡迎大家留言!
