Вопрос о правах роли в Strapi — безголовая CMS Node.js с открытым исходным кодом
Как создать новые разрешения для роли strapi относительно роли Authenticated или Public? Я хочу создать новую роль с такими же всеми permissions в функции начальной загрузки. Я не уверен, как должен выглядеть payload, чтобы создать новый role.
const payload = ?
strapi.plugins['users-permissions']
.queries('role', 'users-permissions')
.create(payload)
Я проверил относительный вопрос о стеке, но не о создании нового разрешения на роль страпи. Начальная загрузка разрешений роли Strapi!
Главная проблема
побочные вопросы
plugins или services, если да, где ее можно найти?services или orm из экземпляра queries?Привет Джим! Да, я хочу создать новую роль при первой загрузке и расширить эту роль всеми доступными разрешениями. Я собираюсь настроить разрешения для новой роли в соответствии с индивидуальными требованиями для каждой новой роли — это следующий шаг.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Итак, поскольку структура данных может измениться, я дам вам доступ к полезным данным, которые помогут вам справиться с тем, что вы хотите.
В этом этот файл вы найдете сервисную функцию, которая создает роли, и функцию, которая инициализирует ее разрешения.
Вы можете написать свой код в файле bootstrap.js.
const lang = 'en';
const plugins = await strapi.plugins[
'users-permissions'
].services.userspermissions.getPlugins(lang);
const permissions = await strapi.plugins[
'users-permissions'
].services.userspermissions.getActions(plugins);
Настройте этот объект (объект permissions), чтобы разрешить нужные вам функции контроллера.
И, наконец, создайте свою роль
const role = {
name: 'NewRole',
description: 'can be an empty string',
permissions, // That is the step 1/2 object
users: []
};
await strapi.plugins[
'users-permissions'
].services.userspermissions.createRole(role);
Большое спасибо. Это работает очень хорошо. Полезная нагрузка очень сложная - вы что в этом нуждаетесь?
Я вижу, что вы пользуетесь услугами. Какой API лучше использовать сервисы или формы из экземпляра запросов? :)
Предлагаю воспользоваться услугами. Потому что вы можете добавить пользовательскую логику в одну точку, которая будет применяться ко всем местам, использующим эти сервисы. Так легче распространить модификацию по всему коду.
Большое спасибо за это. К сожалению, такие вещи вообще не документированы.
Я взял ответ @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;
};
Привет! Вы хотите создать новую роль при первой начальной загрузке? Это после? Документации по этой теме нет.