通常,登录用户会获得内容类型的所有条目。
我创建了一个“摘要”内容类型 (_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路由而不是整个代码段路由的权限。