Magento – How to add admin user role programatically

acladmin-useradminhtmlmagento2user-roles

I need to add user role and set that user to edit/add/view only specific products on admin page.

Best Answer

Here we create admin user role programmatically by custom module installer with specific resources.

First you need to create a installer file name InstallData.php in our custom module Setup folder

complete path:

app/code/ModuleNameSpace/YourModuleName/Setup

<?php 

namespace ModuleNameSpace\YourModuleName\Setup; 

use Magento\Framework\Setup\InstallDataInterface; 
use Magento\Framework\Setup\ModuleContextInterface; 
use Magento\Framework\Setup\ModuleDataSetupInterface; 
use Magento\Authorization\Model\UserContextInterface; 

// For get RoleType and UserType for create Role
use Magento\Authorization\Model\Acl\Role\Group as RoleGroup; 

class InstallData implements InstallDataInterface 
{ 
    /** 
     * RoleFactory
     * 
     * @var roleFactory 
     */ 
    private $roleFactory; 

    /** 
     * RulesFactory 
     * 
     * @var rulesFactory 
     */ 
    private $rulesFactory; 

    /** 
     * Init 
     */ 
    public function __construct( 
        \Magento\Authorization\Model\RoleFactory $roleFactory, // Instance of Role
        \Magento\Authorization\Model\RulesFactory $rulesFactory // Instance of Rule 
    ) { 
        // this define that which resource permitted to wich role 
        $this->roleFactory = $roleFactory; 
        $this->rulesFactory = $rulesFactory; 
    } 

    public function install(
        ModuleDataSetupInterface $setup,
        ModuleContextInterface $context
    ) { 
        // Create Warehouse role
        $role = $this->roleFactory->create();
        $role
            ->setName('YourRoleName') //Set Role Name Which you want to create 
            ->setPid(0) //set parent role id of your role 
            ->setRoleType(RoleGroup::ROLE_TYPE) 
            ->setUserType(UserContextInterface::USER_TYPE_ADMIN); 

        $role->save(); 
        
        // Now we set that which resources we allow to this role
        $resource=[
            'Magento_Backend::admin',
            'Magento_Sales::sales',
            'Magento_Sales::create',
            'Magento_Sales::actions_view',  // you will use resource id which you want tp allow
            'Magento_Sales::cancel'
        ]; 

        // Array of resource ids which we want to allow this role
        $this->rulesFactory->create()
            ->setRoleId($role->getId())
            ->setResources($resource)
            ->saveRel(); 
    } 
}

You can get resources id as explain in following snap

After adding these file install your custom module in your magento2 instance

then by terminal run following commend in your magento2 root directory

php bin/magento setup:upgrade

Now  your admin user role created  you can check it  from System > Permission > User Role.

Reference: Create user role programmatically using custom module installer

Related Topic