AdminJS集成MongoDB后buildAuthenticatedRouter登录跳转异常问题
问题解决:AdminJS认证后跳转回登录页
你的问题核心是session无法正确持久化或验证,虽然认证函数执行成功,但AdminJS无法识别已登录状态,导致重定向回登录页。以下是具体修复方案:
关键修复点
1. 等待MongoDB连接完成再初始化Session Store
当前代码中mongoose.connect是异步操作,但没有等待连接成功就创建sessionStore,可能导致Store初始化时MongoDB客户端未就绪,session无法正常存储。
2. 修正Session配置参数
resave: false:避免在session未修改时强制保存saveUninitialized: false:不保存未初始化的session,符合安全规范- 确保
cookiePassword和session的secret一致,避免签名验证失败
3. 给认证返回的用户对象添加id字段
AdminJS需要用户对象包含唯一标识字段(如id),否则无法正确维护登录状态
修改后的完整代码
import AdminJS from 'adminjs' import * as AdminJSExpress from '@adminjs/express' import express from 'express' import mongoose from 'mongoose' import * as AdminJSMongoose from "@adminjs/mongoose" import session from 'express-session' import MongoStore from 'connect-mongo' import dotenv from 'dotenv' dotenv.config() import Users from './app/models/user.js'; const PORT = 3000 const DEFAULT_ADMIN = { id: '1', // 添加唯一标识字段 email: 'admin@example.com', password: 'password', } AdminJS.registerAdapter({ Resource: AdminJSMongoose.Resource, Database: AdminJSMongoose.Database, }) const authenticate = async (email, password) => { if (email === DEFAULT_ADMIN.email && password === DEFAULT_ADMIN.password) { console.log("Login worked!"); return Promise.resolve(DEFAULT_ADMIN) } return null } const start = async () => { const app = express() // 等待MongoDB连接成功 await mongoose.connect(process.env.DB_URI,{ useNewUrlParser: true, useUnifiedTopology: true }); console.log('MongoDB连接成功') const sessionStore = MongoStore.create({ client: mongoose.connection.getClient(), collectionName: "session", stringify: false, autoRemove: "interval", autoRemoveInterval: 1 }); const adminOptions = { resources:[Users], rootPath:"/admin" } const admin = new AdminJS(adminOptions); const adminRouter = AdminJSExpress.default.buildAuthenticatedRouter( admin, { authenticate, cookieName: 'adminjs', cookiePassword: 'sessionsecret', // 和session的secret保持一致 }, null, { store: sessionStore, resave: false, // 修正为false saveUninitialized: false, // 修正为false secret: 'sessionsecret', cookie: { httpOnly: process.env.NODE_ENV === 'production', secure: process.env.NODE_ENV === 'production', maxAge: 24 * 60 * 60 * 1000, // 可选:设置session有效期 }, name: 'adminjs', // 和cookieName保持一致 } ) app.use(admin.options.rootPath, adminRouter) app.listen(PORT, () => { console.log(`AdminJS started on http://localhost:${PORT}${admin.options.rootPath}`) }) } start().catch(err => console.error('启动失败:', err))
额外检查项
- 确认
process.env.DB_URI正确指向你的MongoDB实例 - 检查MongoDB中
sessions集合是否能正常创建和写入数据 - 本地开发时
secure: false是正确的,生产环境需要设为true(配合HTTPS)
内容的提问来源于stack exchange,提问作者garson
相关产品推荐
相关产品推荐

