Daniel Karski
Daniel Karski

Reputation: 346

Bootstraping new Strapi Role Permissions

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?

Upvotes: 1

Views: 4279

Answers (2)

rikkit
rikkit

Reputation: 1137

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.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;
};

Upvotes: 1

Jim LAURIE
Jim LAURIE

Reputation: 4120

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

Upvotes: 9

Related Questions