KeystoneJS 教程第四课:实现用户认证与会话管理
前言
在上一课中,我们为博客系统实现了发布工作流。现在,我们将为KeystoneJS应用添加用户认证和会话管理功能,确保只有经过身份验证的用户才能访问管理后台。
密码字段的添加
KeystoneJS提供了专门的password
字段类型,它内置了安全最佳实践:
- 数据库中的密码会被自动哈希存储
- 管理界面中的密码输入框会自动掩码显示
让我们为User
列表添加密码字段:
import { password } from '@keystone-6/core/fields';
const User = list({
fields: {
// 其他字段...
password: password({ validation: { isRequired: true } })
},
});
认证系统的实现
安装认证包
KeystoneJS的认证功能作为独立模块提供,需要单独安装:
npm install @keystone-6/auth
配置认证
创建auth.ts
文件并添加以下配置:
import { createAuth } from '@keystone-6/auth';
const { withAuth } = createAuth({
listKey: 'User', // 使用User列表进行认证
identityField: 'email', // 使用email作为登录标识
sessionData: 'name', // 会话中存储用户名
secretField: 'password' // 使用password字段验证
});
会话管理
添加会话支持,使认证状态能在页面刷新后保持:
import { statelessSessions } from '@keystone-6/core/session';
const session = statelessSessions({
maxAge: 60 * 60 * 24, // 会话有效期24小时
secret: '-- 请修改为随机字符串 --' // 会话加密密钥
});
集成到Keystone配置
将认证和会话系统集成到主配置中:
import { withAuth, session } from './auth';
export default config(
withAuth({
// 其他配置...
session,
ui: {
isAccessAllowed: (context) => !!context.session?.data, // 仅允许已认证用户
},
})
);
初始用户创建
为防止系统无用户时被锁定,配置初始用户创建功能:
const { withAuth } = createAuth({
// 其他配置...
initFirstItem: {
fields: ['name', 'email', 'password'], // 首次运行时创建用户所需的字段
},
});
当数据库中没有用户时,管理界面会显示用户注册表单,允许创建第一个管理员账户。
安全建议
- 会话密钥:务必在生产环境中替换默认的会话密钥
- 密码策略:考虑添加更复杂的密码验证规则
- HTTPS:生产环境必须启用HTTPS以确保会话安全
总结
通过本课学习,我们实现了:
- 用户密码的安全存储
- 基于邮箱和密码的认证系统
- 会话管理功能
- 管理后台的访问控制
- 初始用户创建机制
这些功能为应用提供了基本的安全保障,下一课我们将探索富文本编辑功能的实现。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考