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

Я разработчик, который впервые занимается фронтендом, страпи и javascript. Я надеюсь, что кто-то сжалится надо мной и предоставит пример того, как установить разрешения роли Public с помощью скрипта bootstrap.js. узел.js v10.16.0
Strapi v3.0.0-next.11
График 14.3.1
МонгоБД: 3.6
Все на Windows 10

В пользовательском интерфейсе Strapi это роли и разрешения для публичной роли. Начальная загрузка разрешений роли Strapi Я хочу установить эти поля в CHECKED Начальная загрузка разрешений роли Strapi

Другой разработчик использовал файл bootstrap.js для добавления элементов в созданные нами службы (меню). Я не знаю, как вернуть даже самую основную информацию о правах роли. Моя функция называется test(). Я искал примеры, и лучшее, что я нашел, это в stackoverflow: Разрешение по умолчанию для маршрута плагина Strapi :

strapi.plugins['users-permissions'].models.role.find 

но я не могу понять, как его использовать:

WORKING
function add_widgets_from_sheet(sheet_name, model_object){
  console.info(`adding ${sheet_name}`)
  let xlsxSheet = Sheets[sheet_name]
  const widgets = XLSX.utils.sheet_to_json(xlsxSheet)

  widgets.forEach(function (widget) {
    //See if the object is already in the db before adding it
    model_object.count(widget)
      .then(result => {
        if (result == 0) {
          console.info('Adding '+sheet_name+': ' + JSON.stringify(widget))
          return model_object.add(widget)
        }
      })
  })
}

NOT WORKING
function test(){
  console.info(`Testing ${strapi.plugins['users-permissions'].models.role.find}`)
}

module.exports = next => {

  console.info('Starting Strapi bootstrap')
  add_widgets_from_sheet('Menus', strapi.services.menu) //adding menus
  test() // Returning nothing
  console.info('Ending Strapi bootstrap')
  next()
}

Я хотел бы переключить эти флажки на TRUE, CHECKED или как там это называется. так что нам не нужно делать это вручную через пользовательский интерфейс каждый раз, когда мы выгружаем базу данных.

Я лучше всего учусь на примерах... Надеюсь, вы поможете. Спасибо!

Поведение ключевого слова "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) для оценки ваших знаний,...
7
0
3 480
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

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

Итак, приведенный ниже код взят из файла PROJECT/STRAPI/config/functions/bootstrap.js. Это автоматизирует создание типов контента и контента с информацией, которую мы храним в электронной таблице Excel. Но для того, чтобы использовать эти типы контента, необходимо активировать роли и разрешения, чтобы веб-интерфейс мог получить к ним доступ. По сути, мы не хотим вручную заходить в пользовательский интерфейс Strapi, чтобы создать пользователя, создать типы контента, создать контент или обновить разрешения. Мы хотим, чтобы сценарий делал все это.

'use strict'

Наши переменные среды

require('dotenv').config({ path:'../.env' })

Электронная таблица Excel, содержащая наши данные (прилагается)

const XLSX = require('xlsx')
const BOOTSTRAP_DATA = XLSX.readFile(process.env.BOOTSTRAP_DATA).Sheets

Переменные, извлеченные из .env

const ADMIN_USERNAME = process.env.ADMIN_USERNAME
const ADMIN_PASSWORD = process.env.ADMIN_PASSWORD
const ADMIN_EMAIL    = process.env.ADMIN_EMAIL

Чтение в формате XLSX

async function bootstrap_resource(resource_type, resource_service) {
  strapi.log.info(`Bootstrapping ${resource_type}`)

  const resources = XLSX.utils.sheet_to_json(BOOTSTRAP_DATA[resource_type])

  for (let resource of resources) {

    if (await resource_service.count(resource) === 0) {
      strapi.log.warn(`Bootstrapping ${resource_type}: ${JSON.stringify(resource)}`)

      await resource_service.create(resource)
    }
  }
}

Создание начального ПОЛЬЗОВАТЕЛЯ для страпи

async function bootstrap_admin() {
  strapi.log.info(`Bootstrapping Admin`)

  const admin_orm = strapi.admin.queries('administrator', 'admin')

  const admins = await admin_orm.find({username: ADMIN_USERNAME})

  if ( admins.length === 0) {
    const blocked  = false
    const username = ADMIN_USERNAME
    const password = await strapi.admin.services.auth.hashPassword(ADMIN_PASSWORD)
    const email    = ADMIN_EMAIL
    const user     = { blocked, username, password, email }

    const data = await admin_orm.create(user)

    strapi.log.warn(`Bootstrapped Admin User: ${JSON.stringify(user)}`)
  }
}

Ниже приведены get_roles() — требуется для get_permissions(), и get_permissions() требуется для enable_permissions(). Здесь мы включаем эти типы контента, чтобы веб-интерфейс мог их видеть.

async function get_roles() {
  const role_orm = strapi.plugins['users-permissions'].queries('role', 'users-permissions')

  const role_list = await role_orm.find({}, [])

  const roles = {}

  for (let role of role_list) {
    roles[ role._id ] = role
    roles[ role.name ] = role
  }

  return roles
}

async function get_permissions( selected_role, selected_type, selected_controller ) {
  const roles          = await get_roles()
  const permission_orm = strapi.plugins['users-permissions'].queries('permission', 'users-permissions')

  let permission_list  = await permission_orm.find({_limit: 999}, [])

  if ( selected_role       ) permission_list = permission_list.filter( ({ role       }) => `${role}`       === `${roles[selected_role]._id}` )
  if ( selected_type       ) permission_list = permission_list.filter( ({ type       }) => `${type}`       === `${selected_type}`            )
  if ( selected_controller ) permission_list = permission_list.filter( ({ controller }) => `${controller}` === `${selected_controller}`      )

  return permission_list
}

async function enable_permissions(role, type, controller) {
  strapi.log.info(`Setting '${controller}' permissions for '${role}'`)

  const permission_orm = strapi.plugins['users-permissions'].queries('permission', 'users-permissions')

  const permissions = await get_permissions(role, type, controller)

  for (let { _id } of permissions) {
    permission_orm.update({ _id }, { enabled: true })
  }
}

Наконец, запускаем программу

module.exports = async next => {

  await bootstrap_admin()

  await bootstrap_resource( 'Clients', strapi.services.client )
  await bootstrap_resource( 'Menus',   strapi.services.menu   )

  enable_permissions('Public', 'application', 'client'     )
  enable_permissions('Public', 'application', 'github'     )
  enable_permissions('Public', 'application', 'menu'       )
  enable_permissions('Public', 'application', 'confluence' )

  next()
}

Уберите мои комментарии, и у вас будет весь файл bootstrap.js. На изображениях ниже показаны 3 вкладки рабочей книги demo.xlsx, которая используется для заполнения всего. clients tabmenus tabusers tab

Наконец, показ результатов. Меню (контент), набор разрешений и общедоступный веб-сайт с использованием Nuxt. list of menuspermissions for the public usersNuxt Generate Web Page leveraging strapi

strapi.plugins.users-permissions.models.permission.update не является функцией?

Quinn Keaveney 05.05.2020 23:04

Вы уже поняли это в своем ответе, но для всех остальных вам нужно сделать strapi.query('permission', 'users-permissions') сейчас. Взято из здесь

Tom Saleeba 22.10.2020 07:38

Со Strapi 3.2.4 я получаю: Error: The model administrator can't be found. как часть процедуры загрузки администратора.

jorisw 09.11.2020 15:52

Я нахожу это проще.

// In your bootstrap.js file
'use strict';
module.exports = async () => {

    const authenticated = await strapi.query('role', 'users-permissions').findOne({ type: 'authenticated' });
    authenticated.permissions.forEach(permission => {

        if (permission.type === 'application'){ // Whatever permissions you want to change
            let newPermission = permission;
            newPermission.enabled = true; // Editing permission as needed

            strapi.query('permission', 'users-permissions').update( { id: newPermission.id }, newPermission ); // Updating Strapi with the permission
        }
    });
    return;
};

Основываясь на обоих предыдущих ответах, кажется, что вы можете обойтись одним циклом, в котором вы можете установить разрешения как для пользователей public, так и для пользователей authenticated.

Это было написано для страпи 3.2.4, и я использую NodeJS 12, поэтому доступны такие вещи, как оператор спреда ....

  const permOrm = strapi.query('permission', 'users-permissions')
  const perms = await permOrm.find({ type: 'application' })
  for (const curr of perms) {
    if (curr.role.type === 'authenticated') {
      strapi.log.info(
        `Allowing authenticated to call ${curr.controller}.${curr.action}`,
      )
      permOrm.update({ id: curr.id }, { ...curr, enabled: true })
      continue
    }
    // permission is for public
    const isReadEndpoint = ['find', 'findone', 'count'].includes(curr.action)
    if (isReadEndpoint) {
      strapi.log.info(
        `Allowing public to call ${curr.controller}.${curr.action}`,
      )
      permOrm.update({ id: curr.id }, { ...curr, enabled: true })
      continue
    }
    // TODO add custom logic for any non-standard actions here
    strapi.log.info(
      `Disallowing public from calling ${curr.controller}.${curr.action}`,
    )
    permOrm.update({ id: curr.id }, { ...curr, enabled: false })
  }

Для страпи 3.3.x и, возможно, будущих версий
Немного эффективный способ (запрашивает роль один раз, использует запрос для фильтрации разрешений)

'use strict';

module.exports = async () => {
  const publicRole = await getRoleByName('Public')
  await grantPermissions(publicRole, 'application', 'images', ['upload', 'remove'])  // upload, remove in 'images' controller
  await grantPermissions(publicRole, 'application', 'project') // any action in 'project' controller                      
};

async function getRoleByName(name) {
  return strapi.query('role', 'users-permissions').findOne({ name }, [])
}

async function getPermissions(role, permissionType, controller, actions = null) {
  const permissionQuery = strapi.query('permission', 'users-permissions')
  const permissionRequest = {
    _limit: 1000,
    role: role.id,
    type: permissionType,
    controller: controller
  }

  if (actions) {
    permissionRequest.action_in = Array.isArray(actions) ? actions : [actions]
  }

  return permissionQuery.find(permissionRequest, [])
}

async function grantPermissions(role, permissionType, controller, actions) {
  if (actions && !Array.isArray(actions)) {
    actions = [ actions ]
  }
  strapi.log.info(`Setting '${controller}' [${actions ? actions.join(', ') : '*'}] permissions for '${role.name}'`)

  const permissionQuery = strapi.query('permission', 'users-permissions')
  const permissions = await getPermissions(role, permissionType, controller, actions)
  if (permissions.length === 0) {
    throw new Error(`Error enabling permissions: ${role.name}, ${permissionType}, ${controller}, ${actions}`)
  }

  for (const { id } of permissions) {
    await permissionQuery.update({ id }, { enabled: true })
  }
}

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