koa2项目,如何给指定页面加进入前是否登录验证?

发布于 2022-09-07 08:51:26 字数 5054 浏览 12 评论 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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

我不吻晚风 2022-09-14 08:51:26

https://www.cnblogs.com/beile...

我知道了,使用isAuthenticated()可以来判断是否登录,然后进行跳转,但是想问问大家这个如何可以集成成一个方法,然后供所有路由使用呢?

=============================================================
2018.7.6
已实现拦截器,进行全局登录校验
https://www.cnblogs.com/beile...

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文