Koa2 project, how to add login verification to the specified page before entering?

For the project written by

koa2, the koa-passport,koa-session, is used to verify whether or not to log in to the specified page. By default, the user information is saved in session when logging in, and the user information is deleted. If you do not log in, jump to the login page.

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")
/**
 * modelsjsrequire
 * @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 = PPn
    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.

I see that isAuthenticated () can be used to determine whether to log in, and then jump, but I would like to ask you how this can be integrated into a method, and then used by all routes?

=
July 6, 2018.6
the interceptor has been implemented and global login verification is performed
https://www.cnblogs.com/beile.

.
Menu