The following snippets show how to implement ACL (Access-Control-List) for system configuration fields and main menu entries of your own modules.  It is also shown, how to check the ACL’s in the PHP code of your Module.
Implement ACL – Access control for system configuration
If you had configured a system configuration (System→Configuration) like this:
<?xml version="1.0" encoding="utf-8"?> <config> <sections> <asksheldon_friendsandfamily translate="label" module="asksheldon_friendsandfamily"> <label>Friends & Family</label> <tab>customer</tab> <frontend_type>text</frontend_type> <sort_order>1</sort_order> <show_in_default>1</show_in_default> <show_in_website>1</show_in_website> <show_in_store>0</show_in_store> <groups> <general translate="label" module="asksheldon_friendsandfamily"> <label>General</label> <frontend_type>text</frontend_type> <sort_order>1</sort_order> <show_in_default>1</show_in_default> <show_in_website>1</show_in_website> <show_in_store>0</show_in_store> <fields> <enabled translate="label"> <label>Enable</label> <frontend_type>select</frontend_type> <source_model>adminhtml/system_config_source_yesno</source_model> <sort_order>10</sort_order> <show_in_default>1</show_in_default> <show_in_website>1</show_in_website> <show_in_store>0</show_in_store> </enabled> <customer_groups translate="label comment"> <label>Customer groups</label> <frontend_type>multiselect</frontend_type> <source_model>adminhtml/system_config_source_customer_group</source_model> <sort_order>11</sort_order> <show_in_default>1</show_in_default> <show_in_website>1</show_in_website> <show_in_store>0</show_in_store> <comment>Groups for Friends & Family discounts.</comment> </customer_groups> </fields> </general> <welcomeemail> <label>Editmail</label> <frontend_type>text</frontend_type> <sort_order>2</sort_order> <show_in_default>1</show_in_default> <show_in_website>1</show_in_website> <show_in_store>0</show_in_store> <fields> <identity translate="label"> <label>Welcomemail Sender</label> <frontend_type>select</frontend_type> <source_model>adminhtml/system_config_source_email_identity</source_model> <sort_order>2</sort_order> <show_in_default>1</show_in_default> <show_in_website>1</show_in_website> <show_in_store>0</show_in_store> </identity> <template translate="label"> <label>Welcomemail-Template</label> <frontend_type>select</frontend_type> <source_model>adminhtml/system_config_source_email_template</source_model> <sort_order>3</sort_order> <show_in_default>1</show_in_default> <show_in_website>1</show_in_website> <show_in_store>0</show_in_store> </template> <copy_to translate="label comment"> <label>Send Welcome Copy To</label> <frontend_type>text</frontend_type> <sort_order>5</sort_order> <show_in_default>1</show_in_default> <show_in_website>1</show_in_website> <show_in_store>0</show_in_store> <comment>Comma-separated.</comment> </copy_to> <copy_method translate="label"> <label>Send Welcome Copy Method</label> <frontend_type>select</frontend_type> <source_model>adminhtml/system_config_source_email_method</source_model> <sort_order>6</sort_order> <show_in_default>1</show_in_default> <show_in_website>1</show_in_website> <show_in_store>0</show_in_store> </copy_method> </fields> </welcomeemail> </groups> </asksheldon_friendsandfamily> </sections> </config>
… you can define ACLs like that:
<?xml version="1.0" encoding="utf-8"?> <config> <acl> <resources> <admin> <children> <system> <children> <config> <children> <asksheldon_friendsandfamily translate="title" module="asksheldon_friendsandfamily"> <title>Friends & Family</title> </asksheldon_friendsandfamily> </children> </config> </children> </system> </children> </admin> </resources> </acl> </config>
You can use more <children> <BEZEICHNER> level to refine the access possibilities (f.e.: only access to general tab).
Implement ACL – Access control for menu entries
For main menu entries as described here you have to configure the right ACLs as follows:
<?xml version="1.0"?> <config> <acl> <resources> <all> <title>Allow Everything</title> </all> <admin> <children> <asksheldon_abo> <children> <asksheldon_abomanage> <title>Subscription</title> <sort_order>10</sort_order> </asksheldon_abomanage> <asksheldon_aboexport> <title>Subscription EAN Export</title> <sort_order>20</sort_order> </asksheldon_aboexport> <asksheldon_aboguestexport> <title>Subscription Guest Export</title> <sort_order>30</sort_order> </asksheldon_aboguestexport> </children> </asksheldon_abo> </children> </admin> </resources> </acl> </config>
Implement ACL – Check ACLs
If you have the following ACL (not necessarily for system configuration oder menus → can also be for its own):
<config> <acl> <resources> <admin> <children> <asksheldon_milesandmore translate="title" module="asksheldon_milesandmore"> <title>Miles & More</title> <children> <allow_view> <title>Backenduser can view the customers cardnumber</title> </allow_view> <allow_edit> <title>Backenduser can view and edit the customers cardnumber</title> </allow_edit> </children> </asksheldon_milesandmore> </children> </admin> </resources> </acl> </config>
… you can check if the customer is allowed to access that interface by:
<?php $bIsAllowed = Mage::getSingleton('admin/session')->isAllowed('admin/asksheldon_milesandmore/allow_view');//path/in/acl/tree ?>
Implement ACL – Own Controller Actions
Since version “I have no idea 😉 ” you have to implement a _isAllowed – function in your controller to grant restricted access for a certain user role.
For example:
if you have a ACL and menu definition like that:
<?xml version="1.0" encoding="UTF-8"?> <config> <menu> <sheldon_wysiwyg module="sheldon_wysiwyg"> <title>WYSIWYG</title> <sort_order>88</sort_order> <children> <test module="sheldon_wysiwyg" translate="title"> <title>Test</title> <sort_order>0</sort_order> <action>adminhtml/sheldonwysiwyg_data</action> </test> <template_js module="sheldon_wysiwyg" translate="title"> <title>Template</title> <sort_order>1</sort_order> <action>adminhtml/sheldonwysiwyg_data/template</action> </template_js> </children> </sheldon_wysiwyg> </menu> <acl> <resources> <admin> <children> <sheldon_wysiwyg module="sheldon_wysiwyg"> <title>WYSIWYG</title> <sort_order>88</sort_order> <children> <test module="sheldon_wysiwyg" translate="title"> <title>Test</title> <sort_order>0</sort_order> <action>adminhtml/sheldonwysiwyg_data</action> </test> <template_js module="sheldon_wysiwyg" translate="title"> <title>Template</title> <sort_order>1</sort_order> <action>adminhtml/sheldonwysiwyg_data/template</action> </template_js> </children> </sheldon_wysiwyg> </children> </admin> </resources> </acl> </config>
you have to implement:
<?php protected function _isAllowed() { return Mage::getSingleton('admin/session')->isAllowed('admin/sheldon_wysiwyg'); }
in the corresponding controller (Sheldon_Wysiwyg_Adminhtml_Sheldonwysiwyg_DataController in this case).
1 thoughts on “Implement ACL (Access-Control-List) for own Magento modules”