10

通常,登录用户会获得一个内容类型的所有条目。

我创建了一个“片段”内容类型(_id,name,content,users<<->>snippets)

<<->>表示“拥有并属于许多”的关系。

我创建了一些测试用户并提出请求: curl -H 'Authorization: Bearer eyJ...' http://localhost:1337/snippets/

主要问题:经过身份验证的用户应该只看到分配给他的条目。相反,登录用户会获得所有片段,这很糟糕。

如何修改fetchAll(ctx.query);查询以考虑到这一点,以便它fetchAll(ctx.state.user.id);/-route-> find-method 处执行类似操作?

基本的查找方法在这里:

find: async (ctx) => {

    if (ctx.query._q) {
      return strapi.services.snippet.search(ctx.query);
    } else {
      return strapi.services.snippet.fetchAll(ctx.query);
    }
},

子问题:当我进行承载令牌身份验证时,strapi 甚至知道哪个用户登录了吗?

4

3 回答 3

19

您可以在片段配置下设置 /snippets/me 路由。

该路由可以调用 Snippets.me 控制器方法,该方法将检查用户,然后根据用户查询片段。

所以api/snippet/config/routes.json会有类似的东西:

    {
      "method": "GET",
      "path": "/snippets/me",
      "handler": "Snippets.me",
      "config": {
        "policies": []
      }
    },

然后在控制器 ( api/snippet/controllers/Snippet.js) 中,您可以执行以下操作:

  me: async (ctx) => {
    const user = ctx.state.user;    
    if (!user) {
      return ctx.badRequest(null, [{ messages: [{ id: 'No authorization header was found' }] }]);
    }

    const data = await strapi.services.snippet.fetch({user:user.id});  

    if(!data){
      return ctx.notFound();
    }

    ctx.send(data);
  },

然后,您将为经过身份验证的用户授予 me 路由而不是整个片段路由的权限。

于 2018-11-12T22:36:35.887 回答
4

以上是正确的,除了更新版本的strapi。使用find而不是fetch:)

const data = await strapi.services.snippet.find({ user: user.id });

Strapi v3.0.0-beta.20

于 2020-04-16T16:27:02.853 回答
4

一种可能性是扩展控制器使用findfindOne在控制器中使用的查询,并对登录用户进行限制。在这种情况下,您可能还希望使count端点保持一致。

这将导致:

withOwnerQuery: (ctx, ownerPath) => {
  const user = ctx.state.user;
  if (!user) {
    ctx.badRequest(null, [
      { messages: [{ id: "No authorization header was found" }] },
    ]);
    return null;
  }
  return { ...ctx.query, [ownerPath]: user.id };
};

find: async (ctx) => {
    ctx.query = withOwnerQuery(ctx, "owner.id");
    if (ctx.query._q) {
      return strapi.services.snippet.search(ctx.query);
    } else {
      return strapi.services.snippet.fetchAll(ctx.query);
    }
},

// analogous for for findOne

根据您对控制器和服务的使用情况,您可以通过调整服务方法来实现相同的目的。

这种解决方案适用于 GraphQL 插件。

于 2020-05-11T12:07:53.137 回答