当前位置: 首页 > news >正文

next-auth v5 结合 Prisma 实现登录与会话管理

1. 安装依赖

npm install next-auth prisma @prisma/client

2. 配置 Prisma 模型

在 prisma/schema.prisma 文件中定义 User 和 Account 模型(next-auth v5 推荐使用自定义模型)。

model User {id            String    @id @default(uuid())email         String    @uniquename          String?image         String?hashedPassword String?accounts      Account[]createdAt     DateTime  @default(now())updatedAt     DateTime  @updatedAt
}model Account {id               String  @id @default(uuid())userId           Stringprovider         StringproviderAccountId Stringuser             User    @relation(fields: [userId], references: [id], onDelete: Cascade)createdAt        DateTime @default(now())updatedAt        DateTime @updatedAt
}

运行 prisma migrate 同步数据库:

npx prisma migrate dev --name init

3. 创建 next-auth 配置

pages/api/auth/[...nextauth].ts 文件中添加 next-auth 配置:

import NextAuth, { AuthOptions } from "next-auth";
import CredentialsProvider from "next-auth/providers/credentials";
import { PrismaClient } from "@prisma/client";
import { compare } from "bcryptjs"; // 假设密码是加密存储的const prisma = new PrismaClient();export const authOptions: AuthOptions = {providers: [CredentialsProvider({name: "Credentials",credentials: {email: { label: "Email", type: "email" },password: { label: "Password", type: "password" },},async authorize(credentials) {if (!credentials?.email || !credentials.password) {throw new Error("Missing email or password");}// 查找用户const user = await prisma.user.findUnique({where: { email: credentials.email },});if (!user) {throw new Error("No user found");}// 验证密码const isValidPassword = await compare(credentials.password,user.hashedPassword);if (!isValidPassword) {throw new Error("Invalid credentials");}return { id: user.id, email: user.email, name: user.name };},}),],session: {strategy: "jwt",},callbacks: {async jwt({ token, user }) {if (user) {token.id = user.id;}return token;},async session({ session, token }) {if (token) {session.user.id = token.id;}return session;},},
};export default NextAuth(authOptions);`

4. 创建登录页面

示例的登录页面:

import { signIn } from "next-auth/react";
import { useState } from "react";export default function LoginPage() {const [email, setEmail] = useState("");const [password, setPassword] = useState("");const [error, setError] = useState("");const handleSubmit = async (e: React.FormEvent) => {e.preventDefault();const result = await signIn("credentials", {email,password,redirect: false,});if (result?.error) {setError(result.error);} else {// 登录成功,跳转window.location.href = "/";}};return (<form onSubmit={handleSubmit}><div><label>Email</label><inputtype="email"value={email}onChange={(e) => setEmail(e.target.value)}required/></div><div><label>Password</label><inputtype="password"value={password}onChange={(e) => setPassword(e.target.value)}required/></div>{error && <p style={{ color: "red" }}>{error}</p>}<button type="submit">Login</button></form>);
}

5. 使用会话信息

在需要使用用户会话的页面中:

import { useSession, signOut } from "next-auth/react";export default function Dashboard() {const { data: session, status } = useSession();if (status === "loading") {return <p>Loading...</p>;}if (!session) {return <p>You are not logged in</p>;}return (<div><h1>Welcome, {session.user.name}</h1><button onClick={() => signOut()}>Sign out</button></div>);
}

6. 运行应用

npm run dev

关键点说明

密码存储:建议在用户注册时使用 bcrypt 对密码进行加密存储。
Session 策略:此示例使用 JWT 策略,如果需要使用数据库会话,可以将 session.strategy 设置为 “database” 并配置 Prisma 的 Session 模型。
错误处理:authorize 方法中抛出的错误会显示在客户端,可以根据需求自定义错误提示。

相关文章:

next-auth v5 结合 Prisma 实现登录与会话管理

1. 安装依赖 npm install next-auth prisma prisma/client2. 配置 Prisma 模型 在 prisma/schema.prisma 文件中定义 User 和 Account 模型&#xff08;next-auth v5 推荐使用自定义模型&#xff09;。 model User {id String id default(uuid())email …...

WPS excel使用宏编辑器合并 Sheet工作表

使用excel自带的工具合并Sheet表&#xff0c;我们会发现需要开通WPS会员才能使用合并功能&#xff1b; 那么WPS excel如何使用宏编辑器进行合并 Sheet表呢&#xff1f; 1、首先我们要看excel后缀是 .xlsx 还是 .xls &#xff1b;如果是.xlsx 那么 我们需要修改为 .xls 注…...

(即插即用模块-Attention部分) 四十四、(ICIP 2022) HWA 半小波注意力

文章目录 1、Half Wavelet Attention2、代码实现 paper&#xff1a;HALFWAVELET ATTENTION ON M-NET FOR LOW-LIGHT IMAGE ENHANCEMENT Code&#xff1a;https://github.com/FanChiMao/HWMNet 1、Half Wavelet Attention 传统的图像增强方法主要关注图像在空间域的特征信息&am…...

Linux第二课:LinuxC高级 学习记录day04

6、shell中的语句 6.3、结构性语句 6.3.1、if if…then…fi 1、结构 1&#xff09;基本结构 if 表达式 then 命令表 fi if [ 表达式 ] // 【】两侧有空格 then 命令表 fi 2&#xff09;分层结构 if 表达式 then 命令表1 else 命令表2 fi 3&#xff09;嵌套结构 if …...

occ的开发框架

occ的开发框架 1.Introduction This manual explains how to use the Open CASCADE Application Framework (OCAF). It provides basic documentation on using OCAF. 2.Purpose of OCAF OCAF (the Open CASCADE Application Framework) is an easy-to-use platform for ra…...

Redis 如何解决大 key 问题

前言 嗨&#x1f44b;&#xff0c;大家好&#xff0c;我是雪荷。做为一个后端开发&#xff0c;Redis 是我们经常接触到的一个非关系行数据库。其对我们系统开发和优化有着举足轻重的作用&#xff0c;但是随着业务和用户迅速增长&#xff0c;也会滋生许多的问题&#xff0c;而大…...

驱动开发系列33 - Linux Graphics mesa Intel驱动介绍

一:概述 mesa 中的 Intel 驱动体系是为支持 Intel GPU 提供图形 API 的硬件实现部分,主要包括 OpenGL、Vulkan等图形接口,Intel驱动实现整体上分为四层: 第一层:API 层, 实现 OpenGL 和 Vulkan 接口, src/mesa/main、src/vulkan。 第二层:驱动层,实现 OpenGL 和 Vulkan…...

【华为OD-E卷 - 整数编码 100分(python、java、c++、js、c)】

【华为OD-E卷 - 整数编码 100分&#xff08;python、java、c、js、c&#xff09;】 题目 实现一种整数编码方法&#xff0c;使得待编码的数字越小&#xff0c;编码后所占用的字节数越小。 编码规则如下: 编码时7位一组&#xff0c;每个字节的低7位用于存储待编码数字的补码 字…...

vue3 uniapp封装一个瀑布流组件

新增组件m-waterfall 这样就可以在页面直接使用 不用在引入了 <template><view class"m-waterfall"><view id"m-left-column" class"m-column"><slot name"left" :leftList"leftList"></slot&…...

Android Room 持久化库的介绍及使用方法

Android Room 是 Android Jetpack 组件之一&#xff0c;是 Google 官方推出的用于简化 SQLite 数据库操作的持久化库。它提供了一个抽象层&#xff0c;允许开发者在 SQLite 数据库上执行常见的 CRUD 操作&#xff0c;同时处理数据库连接、数据迁移和查询优化等底层细节。 Andr…...

Go语言中http.Transport的Keep-Alive配置与性能优化方法

在Go语言中&#xff0c;http.Transport是一个用于发送HTTP或HTTPS请求的客户端工具&#xff0c;它提供了许多可配置的参数以优化性能。其中&#xff0c;Keep-Alive配置是性能优化的关键部分。以下是对http.Transport的Keep-Alive配置与性能优化方法的详细解释&#xff1a; 一、…...

设计模式03:行为型设计模式之策略模式的使用情景及其基础Demo

1.策略模式 好处&#xff1a;动态切换算法或行为场景&#xff1a;实现同一功能用到不同的算法时和简单工厂对比&#xff1a;简单工厂是通过参数创建对象&#xff0c;调用同一个方法&#xff08;实现细节不同&#xff09;&#xff1b;策略模式是上下文切换对象&#xff0c;调用…...

C# 多线程 Task TPL任务并行

先总结一下 之前发展过程的要点 1&#xff1a; 为了保证多线程正确顺序执行 线程同步 2&#xff1a; 为了节省操作系统线程资源 线程池 异步 方式管理 正常来讲 使用这俩个要点 进行使用 多线程可以满足开发使用需求 但是 新的问题产生了 那就是 多个异步操作 需要编写大量的代…...

【matlab】matlab知识点及HTTP、TCP通信

1、矩阵运算 点乘&#xff1a;对于两个同维度的向量&#xff0c;点乘结果是这两个向量对应分量的乘积之和。 点除&#xff1a;是指对两个数组的对应元素进行除法运算。 点幂&#xff1a;表示元素对元素的幂运算。 >> A[1,2,3;4,5,6]; B[1,1,1;2,2,2]>> D1B.*AD…...

kalilinux - msf和永恒之蓝漏洞

Kali最强渗透工具 - metasploit metasploit是什么&#xff1f; msf是一款开源安全漏洞利用和测试工具&#xff0c;集成了各种平台上常见的溢出漏洞和流行的sheelcode&#xff0c;并持续保持更新。 具体操作 1、先切换到root用户&#xff0c;使用msfdb init命令初始化metaspl…...

网络安全测评质量管理与标准解读

大家读完觉得有帮助记得关注和点赞&#xff01;&#xff01;&#xff01; 注意说明 刚开始写过一些比较专业的分享&#xff0c;较多粉丝反应看不懂&#xff0c;本次通过大众的通俗易懂的词汇先了解概念然后再分享规范和详细的技术原理 一、网络安全测评质量管理 网络安全测…...

Cesium根据地图的缩放zoom实现不同级别下geojson行政边界的对应展示

实现效果&#xff1a; 随着地图的缩放&#xff0c;展示对应缩放级别下的行政边界。 准备数据&#xff1a; 1.国家行政边界数据 &#xff08;country.json&#xff09; 2.省级行政边界数据 &#xff08;province.json&#xff09; 3.市级行政边界数据&#xff08;city.json&…...

Linux初识:【shell命令以及运行原理】【Linux权限的概念与权限管理】

目录 一.shell命令以及运行原理 二.Linux权限的概念与权限管理 2.1Linux权限的概念 sudo普通用户提权 2.2Linux权限管理 2.2.1文件访问者的分类&#xff08;人&#xff09; 2.2.2文件类型和访问权限&#xff08;事物属性&#xff09; 2.2.3文件权限值的表示方法 字符…...

深入剖析 Wireshark:网络协议分析的得力工具

在网络技术的广阔领域中&#xff0c;网络协议分析是保障网络正常运行、优化网络性能以及进行网络安全防护的关键环节。而 Wireshark 作为一款开源且功能强大的网络协议分析工具&#xff0c;在网络工程师、安全专家以及网络技术爱好者中广受欢迎。本文将深入介绍 Wireshark 的功…...

【AIGC】SYNCAMMASTER:多视角多像机的视频生成

标题&#xff1a;SYNCAMMASTER: SYNCHRONIZING MULTI-CAMERA VIDEO GENERATION FROM DIVERSE VIEWPOINTS 主页&#xff1a;https://jianhongbai.github.io/SynCamMaster/ 代码&#xff1a;https://github.com/KwaiVGI/SynCamMaster 文章目录 摘要一、引言二、使用步骤2.1 TextT…...

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站&#xff0c;会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后&#xff0c;网站没有变化的情况。 不熟悉siteground主机的新手&#xff0c;遇到这个问题&#xff0c;就很抓狂&#xff0c;明明是哪都没操作错误&#x…...

JavaSec-RCE

简介 RCE(Remote Code Execution)&#xff0c;可以分为:命令注入(Command Injection)、代码注入(Code Injection) 代码注入 1.漏洞场景&#xff1a;Groovy代码注入 Groovy是一种基于JVM的动态语言&#xff0c;语法简洁&#xff0c;支持闭包、动态类型和Java互操作性&#xff0c…...

多场景 OkHttpClient 管理器 - Android 网络通信解决方案

下面是一个完整的 Android 实现&#xff0c;展示如何创建和管理多个 OkHttpClient 实例&#xff0c;分别用于长连接、普通 HTTP 请求和文件下载场景。 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas…...

Java入门学习详细版(一)

大家好&#xff0c;Java 学习是一个系统学习的过程&#xff0c;核心原则就是“理论 实践 坚持”&#xff0c;并且需循序渐进&#xff0c;不可过于着急&#xff0c;本篇文章推出的这份详细入门学习资料将带大家从零基础开始&#xff0c;逐步掌握 Java 的核心概念和编程技能。 …...

C++ Visual Studio 2017厂商给的源码没有.sln文件 易兆微芯片下载工具加开机动画下载。

1.先用Visual Studio 2017打开Yichip YC31xx loader.vcxproj&#xff0c;再用Visual Studio 2022打开。再保侟就有.sln文件了。 易兆微芯片下载工具加开机动画下载 ExtraDownloadFile1Info.\logo.bin|0|0|10D2000|0 MFC应用兼容CMD 在BOOL CYichipYC31xxloaderDlg::OnIni…...

基于IDIG-GAN的小样本电机轴承故障诊断

目录 🔍 核心问题 一、IDIG-GAN模型原理 1. 整体架构 2. 核心创新点 (1) ​梯度归一化(Gradient Normalization)​​ (2) ​判别器梯度间隙正则化(Discriminator Gradient Gap Regularization)​​ (3) ​自注意力机制(Self-Attention)​​ 3. 完整损失函数 二…...

搭建DNS域名解析服务器(正向解析资源文件)

正向解析资源文件 1&#xff09;准备工作 服务端及客户端都关闭安全软件 [rootlocalhost ~]# systemctl stop firewalld [rootlocalhost ~]# setenforce 0 2&#xff09;服务端安装软件&#xff1a;bind 1.配置yum源 [rootlocalhost ~]# cat /etc/yum.repos.d/base.repo [Base…...

Unity VR/MR开发-VR开发与传统3D开发的差异

视频讲解链接&#xff1a;【XR马斯维】VR/MR开发与传统3D开发的差异【UnityVR/MR开发教程--入门】_哔哩哔哩_bilibili...

C# winform教程(二)----checkbox

一、作用 提供一个用户选择或者不选的状态&#xff0c;这是一个可以多选的控件。 二、属性 其实功能大差不差&#xff0c;除了特殊的几个外&#xff0c;与button基本相同&#xff0c;所有说几个独有的 checkbox属性 名称内容含义appearance控件外观可以变成按钮形状checkali…...

PydanticAI快速入门示例

参考链接&#xff1a;https://ai.pydantic.dev/#why-use-pydanticai 示例代码 from pydantic_ai import Agent from pydantic_ai.models.openai import OpenAIModel from pydantic_ai.providers.openai import OpenAIProvider# 配置使用阿里云通义千问模型 model OpenAIMode…...