我接受了@Jim LAURIE 的回答,并将其与更新现有角色的权限相关。查看node_modules/strapi-plugin-users-permissions/services/UsersPermissions.js 的指针非常有用:)
我有一个page 和post 类型,此代码允许默认的已验证用户和公共用户对其执行所有查看操作。
(PS 我使用的是 TypeScript 注释,但这是纯 JS)。
// bootstrap.js
'use strict';
const _ = require("lodash");
/**
* Bootstrap function, run every startup.
* See https://strapi.io/documentation/v3.x/concepts/configurations.html#bootstrap
*/
module.exports = async () => {
// https://stackoverflow.com/a/57184017/268555
// Ref to https://github.com/strapi/strapi/blob/master/packages/strapi-plugin-users-permissions/services/UsersPermissions.js
const service = await strapi.plugins["users-permissions"].services.userspermissions;
const plugins = await service.getPlugins("en");
/** @type Role[] */
const roles = await service.getRoles();
/**
* @param {Role["type"]} type
*/
const getRole = async (type) => {
const {id} = _.find(roles, x => x.type === type);
return service.getRole(id, plugins);
}
/**
* @param {Role} role
* @param {PluginPermissionKey} type
* @param {string} controller
* @param {string} action
* @param {boolean} enabled
*/
const setPermission = (role, type, controller, action, enabled) => {
try {
role.permissions[type].controllers[controller][action].enabled = enabled;
}
catch (e) {
console.error(`Couldn't set permission ${role.name} ${type}:${controller}:${action}:${enabled}`);
}
}
const authRole = await getRole("authenticated");
setPermission(authRole, "application", "page", "count", true);
setPermission(authRole, "application", "page", "find", true);
setPermission(authRole, "application", "page", "findone", true);
setPermission(authRole, "application", "post", "count", true);
setPermission(authRole, "application", "post", "find", true);
setPermission(authRole, "application", "post", "findone", true);
await service.updateRole(authRole.id, authRole);
const publicRole = await getRole("public");
setPermission(publicRole, "application", "page", "count", true);
setPermission(publicRole, "application", "page", "find", true);
setPermission(publicRole, "application", "page", "findone", true);
setPermission(publicRole, "application", "post", "count", true);
setPermission(publicRole, "application", "post", "find", true);
setPermission(publicRole, "application", "post", "findone", true);
await service.updateRole(publicRole.id, publicRole);
return;
};