KeystoneJS 6未授权用户可查询受认证保护数据问题排查
问题原因与解决方案
核心问题在于:withAuth仅启用了Keystone的认证系统(比如登录流程、session管理),但不会自动为你的业务数据列表(比如Post)添加访问控制规则。
KeystoneJS 6的默认行为是:如果某个数据列表(List)没有配置access属性,所有操作(包括查询、创建、修改、删除)对未认证用户都是开放的。你看到管理界面需要登录,是因为withAuth自动给管理后台加了认证保护,但GraphQL API的权限需要手动为每个列表配置。
解决方法
你需要在定义Post列表的代码里添加access规则,限制未认证用户的访问权限。示例如下:
// 假设你的lists定义在lists.ts这类文件中 import { list, text } from '@keystone-6/core/fields'; export const lists = { Post: list({ fields: { title: text({ validation: { isRequired: true } }), // 其他字段配置... }, // 添加访问控制规则 access: { // 仅允许已认证用户读取帖子 read: ({ session }) => !!session, // 同时限制创建、修改、删除操作 create: ({ session }) => !!session, update: ({ session }) => !!session, delete: ({ session }) => !!session, }, }), User: list({ // User列表的原有配置... }), };
配置完成后,未认证用户再查询Post数据时会收到权限错误,必须先通过AuthenticateUserWithPassword mutation获取sessionToken,并在请求中携带(通过请求头或cookie)才能访问数据。
需要明确:withAuth的配置只负责认证相关逻辑,和数据访问控制是两个独立模块,必须手动为每个业务列表配置access规则才能实现数据保护。
内容的提问来源于stack exchange,提问作者Macs
相关产品推荐
相关产品推荐

