You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 04:00:30