Directus 10.6.2 CSV导入Hook中设置产品分类关联遇FORBIDDEN错误
Directus 10.6.2 Hook CSV导入关联分类时FORBIDDEN错误解决
问题场景
在Directus 10.6.2中开发Hook扩展,实现CSV导入products集合时,通过自定义列category:name自动匹配或创建categories分类条目,但设置input.categories = [分类ID]关联字段时,始终触发FORBIDDEN错误。分类的查找、创建逻辑正常,仅关联步骤失败。
原因分析
- 权限上下文缺失:Hook中创建
ItemsService时仅传入了schema,未携带请求的权限上下文(accountability),导致修改关联字段时权限校验不通过。 - 用户权限不足:执行CSV导入的用户,可能未被授予
products.categories字段的编辑权限,或缺少categories集合的读、创建权限。
解决方案
1. 传递完整权限上下文
从Hook参数中获取accountability并传递给ItemsService,确保操作使用当前请求用户的权限身份。同时记得清理临时字段,避免Directus尝试写入不存在的列。
修改后的代码:
const CATEGORY_NAME_KEY = 'category:name'; filter('products.items.create', async ( input: Partial<Product> | any, { collection }: { collection: string }, { schema, accountability }: { schema: object, accountability: object } ) => { // 传入accountability确保权限上下文完整 const categoriesCollection = new ItemsService('categories', { schema, accountability }); try { const [ existingCategory ] = await categoriesCollection.readByQuery({ filter: { name: input[CATEGORY_NAME_KEY], }}); if (existingCategory?.id) { input.categories = [ existingCategory.id ]; } else { const newCategoryID = await categoriesCollection.createOne({ name: input[CATEGORY_NAME_KEY], }); input.categories = [ newCategoryID ]; } // 删除临时字段,避免导入时触发字段不存在错误 delete input[CATEGORY_NAME_KEY]; } catch(error) { logger.error(error); } return input; });
2. 检查并配置权限
确认执行导入的用户拥有以下权限:
products集合中categories字段的编辑权限categories集合的读权限和创建权限
3. (可选)强制使用管理员权限(不推荐生产环境)
如果导入用户权限无法调整,可在Hook中强制使用管理员上下文执行操作,但会绕过权限校验,需谨慎使用:
const categoriesCollection = new ItemsService('categories', { schema, accountability: { role: 'admin', user: null } });
内容的提问来源于stack exchange,提问作者Hermann Dettmann
相关产品推荐
相关产品推荐

