KeystoneJS 教程第四课:实现用户认证与会话管理

KeystoneJS 教程第四课:实现用户认证与会话管理

keystone The most powerful headless CMS for Node.js — built with GraphQL and React keystone 项目地址: https://gitcode.com/gh_mirrors/key/keystone

前言

在上一课中,我们为博客系统实现了发布工作流。现在,我们将为KeystoneJS应用添加用户认证和会话管理功能,确保只有经过身份验证的用户才能访问管理后台。

密码字段的添加

KeystoneJS提供了专门的password字段类型,它内置了安全最佳实践:

  1. 数据库中的密码会被自动哈希存储
  2. 管理界面中的密码输入框会自动掩码显示

让我们为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'], // 首次运行时创建用户所需的字段
  },
});

当数据库中没有用户时,管理界面会显示用户注册表单,允许创建第一个管理员账户。

安全建议

  1. 会话密钥:务必在生产环境中替换默认的会话密钥
  2. 密码策略:考虑添加更复杂的密码验证规则
  3. HTTPS:生产环境必须启用HTTPS以确保会话安全

总结

通过本课学习,我们实现了:

  • 用户密码的安全存储
  • 基于邮箱和密码的认证系统
  • 会话管理功能
  • 管理后台的访问控制
  • 初始用户创建机制

这些功能为应用提供了基本的安全保障,下一课我们将探索富文本编辑功能的实现。

keystone The most powerful headless CMS for Node.js — built with GraphQL and React keystone 项目地址: https://gitcode.com/gh_mirrors/key/keystone

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

宫文琼Perfect

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值