用于插件的 Strapi v4 扩展服务器 API 不起作用

San*_*and 3 plugins backend strapi

我正在尝试遵循https://docs.strapi.io/developer-docs/latest/developer-resources/plugin-api-reference/server.html#entry-file上的 Strapi v4.0.0 指南来扩展用户-权限插件来添加自定义路由/控制器,但到目前为止还没有成功。我按照文档中的说明添加了自定义文件,但用户界面没有任何变化。

我设法让它适用于以黄色突出显示的普通 API,但无法适用于用户权限插件:

在此输入图像描述

在之前的版本 3.6.8 中,通过扩展文件夹允许使用此功能。

我是否遗漏了新指南中的某些内容,我什至尝试从node_modules>@strapi>plugin-users-permission复制文件并向现有控制器文件添加新的路由和方法,但它仍然没有反映其中部分的更改我们为角色分配不同的路由权限。用户权限插件仍然显示原始路由,没有任何变化。

在此输入图像描述

Dae*_*314 7

我在研究几乎相同的问题时遇到了这个线程,我想分享我的解决方案。

首先,我发现文档的这一部分比您引用的文档更有用:https ://docs.strapi.io/developer-docs/latest/development/plugins-extension.html

我的目标是根据此处的评论编写一条新路线来验证 JWT 令牌: https: //github.com/strapi/strapi/issues/3601#issuecomment-510810027,但针对 Strapi v4 进行了更新。

解决方案很简单:

  1. 创建一个新的文件夹结构:./src/extensions/user-permissions如果不存在。
  2. ./src/extensions/user-permissions/strapi-server.js如果不存在则创建一个新文件。
  3. 将以下内容添加到文件中:
module.exports = (plugin) => {
  plugin.controllers.<controller>['<new method>'] = async (ctx) => {
    // custom logic here
  }

  plugin.routes['content-api'].routes.push({
    method: '<method>',
    path: '/your/path',
    handler: '<controller>.<new method>',
    config: {
      policies: [],
      prefix: '',
    },
  });

  return plugin;
};
Run Code Online (Sandbox Code Playgroud)

如果您不确定哪些控制器可用,您可以随时查看 API 文档 或console.log(plugin)console.log(plugin.controllers)

管理服务器重新启动后,您应该会在用户权限部分下看到您所期望的新路由,并且您可以根据需要为其分配权限。

我的完整strapi-server.js文件包括验证 JWT 的逻辑:

module.exports = (plugin) => {
  plugin.controllers.auth['tokenDecrypt'] = async (ctx) => {
    // get token from the POST request
    const {token} = ctx.request.body;

    // check token requirement
    if (!token) {
      return ctx.badRequest('`token` param is missing')
    }

    try {
      // decrypt the jwt
      const obj = await strapi.plugin('users-permissions').service('jwt').verify(token);

      // send the decrypted object
      return obj;
    } catch (err) {
      // if the token is not a valid token it will throw and error
      return ctx.badRequest(err.toString());
    }
  }

  plugin.routes['content-api'].routes.push({
    method: 'POST',
    path: '/token/validation',
    handler: 'auth.tokenDecrypt',
    config: {
      policies: [],
      prefix: '',
    },
  });

  return plugin;
};
Run Code Online (Sandbox Code Playgroud)