绑带-限制用户仅获取与他有关的数据

roo*_*ahn 4 koa strapi

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

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

<<->> 意思是“拥有并属于许多”关系。

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

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

这怎么可能修改fetchAll(ctx.query);查询,以考虑到这一点,因此不会像fetchAll(ctx.state.user.id);/-route-> find-方法?

基本的查找方法在这里:

find: async (ctx) => {

    if (ctx.query._q) {
      return strapi.services.snippet.search(ctx.query);
    } else {
      return strapi.services.snippet.fetchAll(ctx.query);
    }
},
Run Code Online (Sandbox Code Playgroud)

子问题:当我进行Bearer-Token身份验证时,tradi甚至不知道登录了哪个用户?

小智 5

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

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

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

    {
      "method": "GET",
      "path": "/snippets/me",
      "handler": "Snippets.me",
      "config": {
        "policies": []
      }
    },
Run Code Online (Sandbox Code Playgroud)

然后,在控制器(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);
  },
Run Code Online (Sandbox Code Playgroud)

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