koa2项目,如何给指定页面加进入前是否登录验证?
koa2写的项目,用的koa-passport,koa-session,如何给指定页面加进入前是否登录的验证,默认登录的时候会在session中存起来用户信息,退出删除用户信息,如果没登录则跳转到登录页面。
passport.js
const passport = require('koa-passport')
// const mongoose = require('mongoose')
// const User = mongoose.model('User')
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
app.js:
const config = require('./config/config')
const Koa = require('koa')
const app = new Koa()
const views = require('koa-views')
const json = require('koa-json')
const onerror = require('koa-onerror')
const bodyparser = require('koa-bodyparser')
const log4js = require('koa-log4')
const logger = log4js.getLogger('app')
const favicon = require('koa-favicon')
const session = require('koa-session')
// const passport = require('koa-passport')
const passport = require('./config/passport')
const CSRF = require('koa-csrf')
require('./config/db')
/**
* 获取数据库表对应的js对象所在的路径
* @type {[type]}
*/
const fs = require('fs')
const path = require('path')
const models_path = path.join(__dirname, '/models')
/**
* 以递归的形式,读取models文件夹下的js模型文件,并require
* @param {[type]} modelPath [description]
* @return {[type]} [description]
*/
var walk = function(modelPath) {
fs
.readdirSync(modelPath)
.forEach(function(file) {
var filePath = path.join(modelPath, '/' + file)
var stat = fs.statSync(filePath)
if (stat.isFile()) {
if (/(.*)\.(js|coffee)/.test(file)) {
require(filePath)
}
}
else if (stat.isDirectory()) {
walk(filePath)
}
})
}
walk(models_path)
// error handler
onerror(app)
// middlewares
app.use(bodyparser({
enableTypes: ['json', 'form', 'text']
}))
app.use(json())
// app.use(logger())
// app.use(log4js.koaLogger(log4js.getLogger('http'), {level: 'auto',format:':method :url'}))
app.use(favicon(config.root + '/public/favicon.ico'))
app.use(require('koa-static')(config.root + '/public'))
app.use(views(config.root + '/views', {
extension: 'pug'
}))
// Sessions
app.keys = ['project management system']
const CONFIG = {
key: 'SESSIONID',
}
app.use(session(CONFIG, app))
//统计页面访问次数
/*app.use(ctx => {
// ignore favicon
if (ctx.path === '/favicon.ico') return
let n = ctx.session.views || 0;
ctx.session.views = ++n
ctx.body = n + ' views'
})*/
// passport
app.use(passport.initialize())
app.use(passport.session())
// page utils
app.use(async (ctx, next) => {
ctx.state.page = {page: 1, size: 20}
if (ctx.request.query.page !== undefined) {
ctx.state.page.page = Number(ctx.request.query.page)
}
if (ctx.request.query.size !== undefined) {
ctx.state.page.size = Number(ctx.request.query.size)
}
logger.debug(ctx.state.page)
await next()
})
// add the CSRF middleware
app.use(new CSRF({
invalidSessionSecretMessage: 'Invalid session secret',
invalidSessionSecretStatusCode: 403,
invalidTokenMessage: 'Invalid CSRF token',
invalidTokenStatusCode: 403,
excludedMethods: [ 'GET', 'HEAD', 'OPTIONS', 'POST'],
disableQuery: false
}))
// logger
app.use(async (ctx, next) => {
const start = new Date()
await next()
const ms = new Date() - start
logger.debug(`${ctx.method} ${ctx.url} - ${ms}ms`)
})
// routes
const router = require('./config/router')()
app
.use(router.routes())
.use(router.allowedMethods())
// error-handling
app.on('error', (err, ctx) => {
logger.error('server error', err, ctx)
})
module.exports = app
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
https://www.cnblogs.com/beile...
我知道了,使用isAuthenticated()可以来判断是否登录,然后进行跳转,但是想问问大家这个如何可以集成成一个方法,然后供所有路由使用呢?
=============================================================
2018.7.6
已实现拦截器,进行全局登录校验
https://www.cnblogs.com/beile...