Strapi 策略与自定义入门指南

作者:API传播员 · 2025-12-29 · 阅读时间:6分钟
本文详细介绍了Strapi策略的基础知识,包括全局策略、API策略和插件策略的创建与使用方法,并通过实际示例展示如何实现数据验证策略,帮助开发者掌握Strapi策略自定义入门和Strapi策略应用场景。

简介

Strapi 是一个用于构建后端应用程序的无头内容管理系统(Headless CMS)。通过掌握 JavaScript 编程知识,您可以利用 Strapi 提供的策略、中间件、控制器、服务、模型和 Webhook 来自定义后端功能。

本文将深入讲解 Strapi 策略的基础知识,并展示如何在实际项目中使用它们。让我们开始吧!


策略概述

后端开发中,策略(Policy)是一种用于定义请求规则的功能。它可以在请求进入服务器之前进行检查,确保请求符合预设规则。简单来说,策略就像银行的安检系统,只有通过检查的请求才能进入服务器。

在 Strapi 中,策略的主要作用是控制请求的访问权限。您可以根据需求创建以下三种类型的策略:

  • 全局策略:适用于整个项目,没有特定范围。
  • API 策略:仅适用于特定 API。
  • 插件策略:仅限于特定插件使用。

策略的核心逻辑是返回布尔值:

  • 返回 true:允许请求进入服务器。
  • 返回 false:拒绝请求。

全局策略

全局策略适用于整个项目,以下是初始化全局策略的步骤:

初始化全局策略

  1. 运行以下命令:

    yarn strapi generate
  2. 按照提示选择:

    • 策略(Policy)。
    • 输入策略名称,例如 first-policy
    • 选择将策略添加到项目的根目录。

完成后,策略文件会自动生成在 src/policies 文件夹中。例如,创建的 first-policy 文件路径为:

src/policies/first-policy.js

测试全局策略

为了测试策略,我们需要创建一个基本的内容类型。以下是具体步骤:

步骤 1:创建内容类型

  1. 打开 内容类型生成器

  2. 点击 + 创建新的集合类型

  3. 输入名称 Item,并添加以下字段:

    • 名称:数据类型为文本,字段名为 name
    • 代码:数据类型为文本,字段名为 code
    • 价格:数据类型为数字,字段名为 price
  4. 保存内容类型并发布至少一条数据。

步骤 2:配置路由

  1. 打开 设置 > 用户与权限 > 角色
  2. 选择 公共角色,勾选 Item 的所有权限(获取、添加、修改和删除)。
  3. 保存更改。

完成后,您可以通过以下 URL 测试 API:

http://localhost:1337/api/items

注册全局策略到路由

要将全局策略应用到路由,请编辑以下文件:

src/api/item/routes/item.js

createCoreRouter 中添加策略配置。完成后,发起请求即可在控制台中看到策略的日志输出。


API 策略

创建 API 策略的步骤

初始化 API 策略

  1. 运行以下命令:

    yarn strapi generate
  2. 按照提示选择:

    • 策略(Policy)。
    • 输入策略名称,例如 second-policy
    • 选择将策略添加到现有 API,例如 Item

生成的策略文件路径为:

src/api/item/policies/second-policy.js

注册 API 策略到路由

编辑以下文件:

src/api/item/routes/item.js

createCoreRouter 中添加 second-policy 策略。完成后,发起请求即可验证策略的执行情况。


插件策略

插件策略适用于特定插件,例如 Users & Permissions 插件中的 isAuthenticated 策略。以下是创建插件策略的步骤:

初始化插件策略

  1. 运行以下命令:

    yarn strapi generate
  2. 按照提示选择:

    • 策略(Policy)。
    • 输入策略名称。
    • 选择将策略添加到现有插件。

生成的策略文件路径为:

src/plugins/[插件名称]/policies/[策略名称].js

配置插件策略

编辑插件相关的路由文件,例如:

src/plugins/[插件名称]/routes/router.js

createCoreRouter 中添加策略配置。


返回策略失败的消息

在某些情况下,仅返回错误状态码可能不足以说明问题。您可以通过抛出 PolicyError 对象来返回详细的错误信息。例如:

const { PolicyError } = require('@strapi/utils').errors;

module.exports = async (ctx, config, { strapi }) => {
  if (!ctx.state.user) {
    throw new PolicyError('用户未登录', { details: '需要登录后才能访问此资源' });
  }
  return true;
};

使用策略的现实世界示例

假设您正在为一家商店构建后端应用程序,需要确保发送到 Itemcreate 路由的数据格式正确。以下是实现步骤:

安装 Joi 库

在项目根目录运行以下命令安装 Joi:

npm install joi

创建验证策略

src/api/item/policies 文件夹中创建 valid-input.js 文件,并添加以下代码:

const Joi = require('joi');

module.exports = async (ctx, config, { strapi }) => {
  const schema = Joi.object({
    name: Joi.string().required(),
    code: Joi.string().required(),
    price: Joi.number().required(),
  });  const { error } = schema.validate(ctx.request.body);  if (error) {
    ctx.throw(400, '输入数据格式错误', { details: error.details });
  }  return true;
};

注册验证策略

编辑以下文件:

src/api/item/routes/item.js

valid-input 策略添加到 create 路由配置中。

测试策略

使用 Postman 或 Insomnia 发起 POST 请求,测试数据格式验证功能。若数据格式正确,返回状态码 200,否则返回错误信息。


结论

本文介绍了 Strapi 策略的基础知识,包括全局策略、API 策略和插件策略的创建与使用方法。此外,还通过实际示例展示了如何实现数据验证策略。希望这些内容能帮助您更好地理解和应用 Strapi 策略。

如果您有任何疑问或需要进一步了解,请随时留言交流!

原文链接: https://strapi.io/blog/beginners-guide-to-strapi-policies-and-customizations