权限设置
回到admin 界面,在插件里有个Roles & Permissions插件,所有的访问权限都在这里配置。
界面可以看到有两个现成的角色,其中Authenticated 角色是用户登录之后的默认角色,public 角色就是通常说的anonymous 匿名用户。
因为没注册用户,先设置public 角色的权限。
点开public,可以看到下面的权限里,已经有了我们前面创建的两个api的接口设置。
右边显示对应接口的url以及高级的设置(频率限制和是否需要认证)
默认的ratelimit是每分钟十次(可以自定义,后续再说)。
设置好接口权限后,再回到文档页面,现在就不会报错了。
自定义频率设置
strapi是利用koa2-ratelimit实现的频率限制
创建限制规则
在项目目录下的 extensions/users-permissions/config/policies 新建一个 rateLimit.js文件,添加如下内容
const lazyRateLimit = {
get RateLimit() {
return require('koa2-ratelimit').RateLimit;
},
};
module.exports = async (ctx, next) => {
const message = [
{
messages: [
{
id: 'Auth.form.error.ratelimit',
message: 'Too many attempts, please try again in a minute.',
},
],
},
];
return lazyRateLimit.RateLimit.middleware(
Object.assign(
{},
{
interval: 1 * 60 * 1000,
max: 10,
prefixKey: `${ctx.request.url}:${ctx.request.ip}`,
message,
}
)
)(ctx, next);
};
通过这个文件可以自定义设置,例如根据用户名等等。
灵活使用
在项目目录下的api目录可以看到自动生成的两个文件夹,分别对应前面创建的两张表。
假设需要设置文章list接口的频率,只需要在对应的config/routes.json下修改即可。
"method": "GET",
"path": "/articles",
"handler": "article.find",
"config": {
"policies": ["global.rateLimit"] // 添加这个
}
重启服务,现在,这个接口就会遵循刚才设置的频率规则。
注:如果通过文件自定义设置了规则,又在前端指定了ratelimit,而且文件的规则恰好是 prefixKey:
${ctx.request.url}:${ctx.request.ip}
,会出现一次访问相当于两次访问的情况,请仔细注意。