koa2寫的項目,用的koa-passport,koa-session,如何給指定頁面加進(jìn)入前是否登錄的驗證,默認(rèn)登錄的時候會在session中存起來用戶信息,退出刪除用戶信息,如果沒登錄則跳轉(zhuǎn)到登錄頁面。
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 驗證驗證完成后的回調(diào)函數(shù),由passport調(diào)用
*/
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 在用戶登錄驗證成功以后將會把用戶的數(shù)據(jù)存儲到 session 中
passport.serializeUser(function (user, done) {
done(null, user)
})
// deserializeUser 在每次請求的時候?qū)?mongodb 中讀取用戶對象
passport.deserializeUser(function (id, done) {
console.log(id)
User.findById(id, function (err, user) {
done(err, doPassword(user))
})
// done(null, user)
})
//隱藏密碼,相當(dāng)于是去掉密碼的用戶信息保存在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')
/**
* 獲取數(shù)據(jù)庫表對應(yīng)的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))
//統(tǒng)計頁面訪問次數(shù)
/*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
https://www.cnblogs.com/beile...
我知道了,使用isAuthenticated()可以來判斷是否登錄,然后進(jìn)行跳轉(zhuǎn),但是想問問大家這個如何可以集成成一個方法,然后供所有路由使用呢?
=============================================================
2018.7.6
已實現(xiàn)攔截器,進(jìn)行全局登錄校驗
https://www.cnblogs.com/beile...
北大青鳥APTECH成立于1999年。依托北京大學(xué)優(yōu)質(zhì)雄厚的教育資源和背景,秉承“教育改變生活”的發(fā)展理念,致力于培養(yǎng)中國IT技能型緊缺人才,是大數(shù)據(jù)專業(yè)的國家
北大青鳥中博軟件學(xué)院創(chuàng)立于2003年,作為華東區(qū)著名互聯(lián)網(wǎng)學(xué)院和江蘇省首批服務(wù)外包人才培訓(xùn)基地,中博成功培育了近30000名軟件工程師走向高薪崗位,合作企業(yè)超4
中公教育集團(tuán)創(chuàng)建于1999年,經(jīng)過二十年潛心發(fā)展,已由一家北大畢業(yè)生自主創(chuàng)業(yè)的信息技術(shù)與教育服務(wù)機(jī)構(gòu),發(fā)展為教育服務(wù)業(yè)的綜合性企業(yè)集團(tuán),成為集合面授教學(xué)培訓(xùn)、網(wǎng)
達(dá)內(nèi)教育集團(tuán)成立于2002年,是一家由留學(xué)海歸創(chuàng)辦的高端職業(yè)教育培訓(xùn)機(jī)構(gòu),是中國一站式人才培養(yǎng)平臺、一站式人才輸送平臺。2014年4月3日在美國成功上市,融資1
浪潮集團(tuán)項目經(jīng)理。精通Java與.NET 技術(shù), 熟練的跨平臺面向?qū)ο箝_發(fā)經(jīng)驗,技術(shù)功底深厚。 授課風(fēng)格 授課風(fēng)格清新自然、條理清晰、主次分明、重點難點突出、引人入勝。
曾工作于聯(lián)想擔(dān)任系統(tǒng)開發(fā)工程師,曾在博彥科技股份有限公司擔(dān)任項目經(jīng)理從事移動互聯(lián)網(wǎng)管理及研發(fā)工作,曾創(chuàng)辦藍(lán)懿科技有限責(zé)任公司從事總經(jīng)理職務(wù)負(fù)責(zé)iOS教學(xué)及管理工作。
精通HTML5和CSS3;Javascript及主流js庫,具有快速界面開發(fā)的能力,對瀏覽器兼容性、前端性能優(yōu)化等有深入理解。精通網(wǎng)頁制作和網(wǎng)頁游戲開發(fā)。
具有10 年的Java 企業(yè)應(yīng)用開發(fā)經(jīng)驗。曾經(jīng)歷任德國Software AG 技術(shù)顧問,美國Dachieve 系統(tǒng)架構(gòu)師,美國AngelEngineers Inc. 系統(tǒng)架構(gòu)師。