- 69
- 0
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 1
打赏
收藏
点击回答
网站公告
- 扫一扫访问手机版
回答动态

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器更新之后。服务器里面有部分玩家要重新创建角色是怎么回事啊?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题函数计算不同地域的是不能用内网吧?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题ARMS可以创建多个应用嘛?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题在ARMS如何申请加入公测呀?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题前端小程序接入这个arms具体是如何接入监控的,这个init方法在哪里进行添加?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器刚到期,是不是就不能再导出存档了呢?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器的游戏版本不兼容 尝试更新怎么解决?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器服务器升级以后 就链接不上了,怎么办?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器转移以后服务器进不去了,怎么解决?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器修改参数后游戏进入不了,是什么情况?预计能赚取 0积分收益
- 回到顶部
- 回到顶部

