admin管理员组

文章数量:1317909

The question is about role permissions in Strapi - Open source Node.js Headless CMS

How to create new strapi role permissions relative to Authenticated or Public role? I want to create new role with these same all permissions in the bootstrap function. I'm not sure how should look payload to create new role.

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

I checked relative stackoverflow question but isn't about creating new strapi role permission Bootstraping Strapi Role Permissions!

main problem

  1. How look the best way to resolve above problem?

side questions

  1. Is documented schema for plugins or services if yes where could find it?
  2. Which api is better use services or orm from queries instance?

The question is about role permissions in Strapi - Open source Node.js Headless CMS

How to create new strapi role permissions relative to Authenticated or Public role? I want to create new role with these same all permissions in the bootstrap function. I'm not sure how should look payload to create new role.

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

I checked relative stackoverflow question but isn't about creating new strapi role permission Bootstraping Strapi Role Permissions!

main problem

  1. How look the best way to resolve above problem?

side questions

  1. Is documented schema for plugins or services if yes where could find it?
  2. Which api is better use services or orm from queries instance?
Share Improve this question edited Jul 19, 2019 at 7:45 Daniel Karski asked Jul 19, 2019 at 6:30 Daniel KarskiDaniel Karski 3463 silver badges13 bronze badges 2
  • Hello! Do you want to create the new role on the first bootstrap? Are it's after? About this topic, there is no documentation. – Jim LAURIE Commented Jul 22, 2019 at 14:45
  • Hello Jim! Yes, I want to create the new role on the first bootstrap and extend this role by all permissions which are available. I'm going to configure permissions for new role by custom requirements per new role - it's next step – Daniel Karski Commented Jul 23, 2019 at 6:40
Add a ment  | 

2 Answers 2

Reset to default 9

OKay so since the data structure can change I will give you the way to access to useful data that will help you to deal with what you want.

In this this file you will find service function that create roles and the function that inits permissions.

You can write your code in your bootstrap.js file.

  1. You will have to call the functions that let you generate permission object
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. Customize this object (the permissions object) to allow controller functions you want.

  2. And finaly create your role

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

I took @Jim LAURIE 's answer and made it relevant to updating permissions on existing roles. The pointer to look at node_modules/strapi-plugin-users-permissions/services/UsersPermissions.js was very useful :)

I have a page and post type, and this code lets the default authenticated and public users do all view actions on them.

(PS I'm using TypeScript annotations, but this is plain 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./a/57184017/268555
  // Ref to https://github./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;
};

本文标签: javascriptBootstraping new Strapi Role PermissionsStack Overflow