node.js - 如何在所有路线中添加护照js(本地策略)
问题描述
我将经过身份验证的护照添加到我的登录路线,但我不知道如何将其添加到其他路线。现在 (req.isAuthenticated) 在登录路由中为真,但在所有其他路由中为假!!!如何将它添加到所有路由,以便当用户登录时,'req.authenticated' 在它们上变为 true?
登录.js:
const express = require("express");
const router = express.Router();
const path = require("path");
const passport = require("passport");
const session = require("express-session");
const flash = require("express-flash");
const methodOverride = require('method-override');
const bodyParser = require('body-parser');
const { getAdmins } = require("../queries/queries");
//middlewares
router.use(flash());
router.use(
session({
secret: process.env.SESSION_SECRET,
resave: false,
saveUninitialized: false,
})
);
router.use(passport.initialize());
router.use(passport.session());
router.use(methodOverride('_method'));
//passport
const initializePassport = require("../passport-config");
initializePassport(
passport,
async (name) => {
let users = await getAdmins();
return users.find((user) => user.name == name)},
async (id) => {
let users = await getAdmins();
return users.find((user) => user.id == id)}
);
//get metod
router.get("/", checkAuthentication, (req, res) => {
res.render(path.join(__dirname, "../public/login.ejs"), {isLogin : req.isAuthenticated});
});
//post method
router.post(
"/",
passport.authenticate("local", {
successRedirect: "/messages",
failureRedirect: '/login',
failureFlash: true,
})
);
router.delete('/logout', (req, res)=>{
req.logOut();
res.redirect('/');
})
//check req authenticated
function checkAuthentication(req, res, next) {
if (req.isAuthenticated()) {
console.log('login:yes')
return next();
}
console.log('login:no');
return next();
}
module.exports = router;
护照-config.js:
const LocalStrategy = require("passport-local").Strategy;
function initialize(passport, getUserByName, getUserById) {
const authenticateUser = async (name, password, done) => {
const user = await getUserByName(name);
if (user == null) return done(null, false, { message: "sorry! user name is not exist" });
if(password == user.password){
return done(null, user);
} else done(null, false, {message : "incorrect password"});
};
passport.use(new LocalStrategy(authenticateUser));
passport.serializeUser((user, done)=> done(null, user.id));
passport.deserializeUser((id, done)=> done(null, getUserById(id)));
}
module.exports = initialize;
解决方案
为了解决这个问题,我将这段代码从 login.js 转移到 server.js:
//midlewares
app.use(express.json());
app.use(express.urlencoded({ extended: false }));
const bodyParser = require('body-parser');
app.use(bodyParser.urlencoded({extended : false}));
app.use(passport.initialize());
app.use(passport.session());
app.use(flash());
推荐阅读
- java - 返回具有 AVL 树给定范围内所有元素的 LinkedList
- mysql - MySQL 查询 (SELECT) 的问题
- firebase - 在颤振应用程序中更新日期
- r - 如何根据条件更改列表中多个数据框中的列名称?
- reactjs - 使用其他钩子时 usePrevious 可靠吗?
- c++ - 我无法让我的 MergeSort 实现运行
- javascript - 使用 AJAX 在传单上重新加载热图
- java - 如何在 Android 上为 Highcharts 正确配置 DateTime 轴?
- hibernate - 比较 dateCreated 的查询不适用于在 Grails 3.3.10 的测试事务中创建的测试数据
- matplotlib - 从 matplotlib.animation 加载“FuncAnimation”时遇到问题