@@ -23,6 +23,11 @@ class Rule implements LoaderInterface
23
23
*/
24
24
public const ACL_RULE_CACHE_KEY = 'authorization_rule_cached_data ' ;
25
25
26
+ /**
27
+ * Allow everything resource id
28
+ */
29
+ private const ALLOW_EVERYTHING = 'Magento_Backend::all ' ;
30
+
26
31
/**
27
32
* @var ResourceConnection
28
33
*/
@@ -92,27 +97,26 @@ public function populateAcl(\Magento\Framework\Acl $acl)
92
97
*/
93
98
private function applyPermissionsAccordingToRules (\Magento \Framework \Acl $ acl ): array
94
99
{
95
- $ foundResources = [];
96
- $ foundRoles = [];
100
+ $ foundResources = $ foundDeniedRoles = [];
97
101
foreach ($ this ->getRulesArray () as $ rule ) {
98
102
$ role = $ rule ['role_id ' ];
99
103
$ resource = $ rule ['resource_id ' ];
100
104
$ privileges = !empty ($ rule ['privileges ' ]) ? explode (', ' , $ rule ['privileges ' ]) : null ;
101
105
102
106
if ($ acl ->has ($ resource )) {
103
107
$ foundResources [$ resource ] = $ resource ;
104
- $ foundRoles [$ role ] = $ role ;
105
108
if ($ rule ['permission ' ] == 'allow ' ) {
106
109
if ($ resource === $ this ->_rootResource ->getId ()) {
107
110
$ acl ->allow ($ role , null , $ privileges );
108
111
}
109
112
$ acl ->allow ($ role , $ resource , $ privileges );
110
113
} elseif ($ rule ['permission ' ] == 'deny ' ) {
114
+ $ foundDeniedRoles [$ role ] = $ role ;
111
115
$ acl ->deny ($ role , $ resource , $ privileges );
112
116
}
113
117
}
114
118
}
115
- return [$ foundResources , $ foundRoles ];
119
+ return [$ foundResources , $ foundDeniedRoles ];
116
120
}
117
121
118
122
/**
@@ -122,15 +126,20 @@ private function applyPermissionsAccordingToRules(\Magento\Framework\Acl $acl):
122
126
*
123
127
* @param \Magento\Framework\Acl $acl
124
128
* @param array $resources
125
- * @param array $roles
129
+ * @param array $deniedRoles
126
130
* @return void
127
131
*/
128
- private function applyDenyPermissionsForMissingRules (\Magento \Framework \Acl $ acl , array $ resources , array $ roles )
132
+ private function applyDenyPermissionsForMissingRules (\Magento \Framework \Acl $ acl , array $ resources , array $ deniedRoles )
129
133
{
130
- foreach ($ acl ->getResources () as $ resource ) {
131
- if (!isset ($ resources [$ resource ])) {
132
- foreach ($ roles as $ role ) {
133
- $ acl ->deny ($ role , $ resource , null );
134
+ if (count ($ resources ) && count ($ deniedRoles )
135
+ //ignore denying missing permission if all are allowed
136
+ && !(count ($ resources ) == 1 && isset ($ resources [static ::ALLOW_EVERYTHING ]))
137
+ ) {
138
+ foreach ($ acl ->getResources () as $ resource ) {
139
+ if (!isset ($ resources [$ resource ])) {
140
+ foreach ($ deniedRoles as $ role ) {
141
+ $ acl ->deny ($ role , $ resource , null );
142
+ }
134
143
}
135
144
}
136
145
}
0 commit comments