鍍金池/ 問答/Java  HTML/ koa2項目,如何給指定頁面加進(jìn)入前是否登錄驗證?

koa2項目,如何給指定頁面加進(jìn)入前是否登錄驗證?

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...

2017年2月3日 02:07