Basically - you can't do that with core Magento. There is only one ACL resource for products management. More than that - even if my solution below works, I don't recommend it, because in my opinion it's too little added functionality with a cost of 2 class rewrites.
You can do that with code customization, but it needs either plugin creation for each action authorization check which can add some time in code execution to your admin panel globally - I won't do that in that way then.
The other way to do this is by actually rewriting two classes. Those classes are only used for that functionality, so it's not that bad in a practical state, but I don't think it is worth it to do that just for that little functionality. Nevertheless, let's dive into code:
Create etc/acl.xml
to declare your new ACL resource:
<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Acl/etc/acl.xsd">
<acl>
<resources>
<resource id="Magento_Backend::admin">
<resource id="Magento_Catalog::catalog">
<resource id="Magento_Catalog::catalog_inventory">
<resource id="Magento_Catalog::products_grid" title="Products Grid View" translate="title" sortOrder="11" />
</resource>
</resource>
</resource>
</resources>
</acl>
</config>
Change menu item resource for Product Grid (etc/adminhtml/menu.xml
):
<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Backend:etc/menu.xsd">
<menu>
<update id="Magento_Catalog::catalog_products" resource="Magento_Catalog::products_grid"/>
</menu>
</config>
Create etc/adminhtml/di.xml
to declare class preferences:
<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
<preference for="Magento\Catalog\Controller\Adminhtml\Product\Grid"
type="Vendor\ProductViewAclResource\Controller\Adminhtml\Product\Grid"/>
<preference for="Magento\Catalog\Controller\Adminhtml\Product\Index"
type="Vendor\ProductViewAclResource\Controller\Adminhtml\Product\Index"/>
</config>
Vendor\ProductViewAclResource\Controller\Adminhtml\Product\Grid
:
<?php
namespace Vendor\ProductViewAclResource\Controller\Adminhtml\Product;
class Grid extends \Magento\Catalog\Controller\Adminhtml\Product\Grid
{
/**
* Replaced core resource
*
* @see _isAllowed()
*/
const ADMIN_RESOURCE = 'Magento_Catalog::products_grid';
}
Vendor\ProductViewAclResource\Controller\Adminhtml\Product\Index
:
<?php
namespace Vendor\ProductViewAclResource\Controller\Adminhtml\Product;
class Index extends \Magento\Catalog\Controller\Adminhtml\Product\Index
{
/**
* Replaced core resource
*
* @see _isAllowed()
*/
const ADMIN_RESOURCE = 'Magento_Catalog::products_grid';
}