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

使用NextAuth EmailProvider能否按邮箱域名给新用户分配角色?

解决方案:自动为特定域名新用户设置管理员权限

完全可以实现这个需求,无需手动修改数据库。你可以利用NextAuth的createUser事件,在新用户创建完成后自动检查邮箱域名并更新isAdmin字段。

具体修改步骤:

  1. 在你的[...nextauth].js配置中添加events选项,监听用户创建事件:
    当新用户通过邮箱注册时,这个事件会触发,我们在这里检查用户的邮箱域名,如果是指定的管理员域名,就更新数据库中的isAdmin字段为true。

  2. 修改后的完整代码如下:

import NextAuth from "next-auth"
import EmailProvider from "next-auth/providers/email"
import { PrismaAdapter } from "@next-auth/prisma-adapter"
import prisma from "lib/prisma"

let data

if (process.env.NODE_ENV === "development") {
    data = {
        server: process.env.EMAIL_SERVER,
        from: process.env.EMAIL_FROM,
    }
} else {
    data = {
        server: {
            host: process.env.EMAIL_SERVER_HOST,
            port: process.env.EMAIL_SERVER_PORT,
            auth: {
                user: process.env.EMAIL_SERVER_USER,
                pass: process.env.EMAIL_SERVER_PASSWORD,
            },
        },
        from: process.env.EMAIL_FROM,
    }
}

// 定义允许的管理员邮箱域名,可从环境变量读取
const ADMIN_DOMAINS = process.env.ADMIN_DOMAINS?.split(",") || ["your-admin-domain.com"]

export default NextAuth({
    providers: [EmailProvider(data)],

    database: process.env.DATABASE_URL,
    secret: process.env.SECRET,

    session: {
        jwt: true,
        maxAge: 30 * 24 * 60 * 60, // 30 days
    },

    debug: true,
    adapter: PrismaAdapter(prisma),

    callbacks: {
        session: async ({ session, user }) => {
            session.user.id = user.id
            session.user.isAdmin = user.isAdmin
            return Promise.resolve(session)
        },
    },

    // 添加用户创建事件监听
    events: {
        createUser: async ({ user }) => {
            // 检查用户邮箱是否存在并匹配管理员域名
            if (user.email) {
                const emailDomain = user.email.split("@")[1]
                if (ADMIN_DOMAINS.includes(emailDomain)) {
                    await prisma.user.update({
                        where: { id: user.id },
                        data: { isAdmin: true }
                    })
                }
            }
        }
    }
})

额外优化建议:

  • 把管理员域名配置到环境变量中(比如.env文件里设置ADMIN_DOMAINS=example.com,admin.com),这样无需修改代码就能调整允许的域名。
  • 你用的是JWT会话模式,用户下次登录时,session回调会从数据库读取更新后的isAdmin值并同步到会话中,无需额外处理。

验证方式:

用指定域名的邮箱注册新用户,注册完成后查询数据库的User表,就能看到该用户的isAdmin字段已经自动设为true,登录后前端也能通过session.user.isAdmin获取到正确的权限标识。

内容的提问来源于stack exchange,提问作者lucy_who

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 01:21:05