Начальная загрузка новых разрешений роли Strapi

Вопрос о правах роли в Strapi — безголовая CMS Node.js с открытым исходным кодом

Как создать новые разрешения для роли strapi относительно роли Authenticated или Public? Я хочу создать новую роль с такими же всеми permissions в функции начальной загрузки. Я не уверен, как должен выглядеть payload, чтобы создать новый role.

const payload = ?
strapi.plugins['users-permissions']
    .queries('role', 'users-permissions')
    .create(payload)

Я проверил относительный вопрос о стеке, но не о создании нового разрешения на роль страпи. Начальная загрузка разрешений роли Strapi!

Главная проблема

  1. Как выглядит лучший способ решить вышеуказанную проблему?

побочные вопросы

  1. Задокументирована ли схема для plugins или services, если да, где ее можно найти?
  2. Какой API лучше использовать services или orm из экземпляра queries?

Привет! Вы хотите создать новую роль при первой начальной загрузке? Это после? Документации по этой теме нет.

Jim LAURIE 22.07.2019 16:45

Привет Джим! Да, я хочу создать новую роль при первой загрузке и расширить эту роль всеми доступными разрешениями. Я собираюсь настроить разрешения для новой роли в соответствии с индивидуальными требованиями для каждой новой роли — это следующий шаг.

Daniel Karski 23.07.2019 08:40
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
2
3 268
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Итак, поскольку структура данных может измениться, я дам вам доступ к полезным данным, которые помогут вам справиться с тем, что вы хотите.

В этом этот файл вы найдете сервисную функцию, которая создает роли, и функцию, которая инициализирует ее разрешения.

Вы можете написать свой код в файле bootstrap.js.

  1. Вам нужно будет вызвать функции, которые позволят вам создать объект разрешения
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);
  1. Настройте этот объект (объект permissions), чтобы разрешить нужные вам функции контроллера.

  2. И, наконец, создайте свою роль

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);

Большое спасибо. Это работает очень хорошо. Полезная нагрузка очень сложная - вы что в этом нуждаетесь?

Daniel Karski 26.07.2019 15:33

Я вижу, что вы пользуетесь услугами. Какой API лучше использовать сервисы или формы из экземпляра запросов? :)

Daniel Karski 26.07.2019 15:33

Предлагаю воспользоваться услугами. Потому что вы можете добавить пользовательскую логику в одну точку, которая будет применяться ко всем местам, использующим эти сервисы. Так легче распространить модификацию по всему коду.

Jim LAURIE 26.07.2019 17:16

Большое спасибо за это. К сожалению, такие вещи вообще не документированы.

Frébo 28.05.2020 12:01

Я взял ответ @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;
};

Другие вопросы по теме