账号密码登录
微信安全登录
微信扫描二维码登录

登录后绑定QQ、微信即可实现信息互通

手机验证码登录
找回密码返回
邮箱找回 手机找回
注册账号返回
其他登录方式
分享
  • 收藏
    X
    koa2项目,如何给指定页面加进入前是否登录验证?
    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 条
    • 知白 普通会员 1楼
      { "error": "Failed to generate content." }
    更多回答
    扫一扫访问手机版
    • 回到顶部
    • 回到顶部