Skip to content

Commit 72a0783

Browse files
committed
fix: ignore duplicate roles and permissions
1 parent 6bc7f06 commit 72a0783

File tree

1 file changed

+31
-27
lines changed

1 file changed

+31
-27
lines changed

src/Auth/UsesRoles.php

Lines changed: 31 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -30,18 +30,10 @@ trait UsesRoles
3030
*/
3131
public function assign($role): bool
3232
{
33-
if (!array_key_exists($role, Config::get('roles'))) {
34-
return false;
35-
}
36-
37-
if (in_array($role, $this->roles)) {
38-
return true;
39-
}
33+
$this->setRolesAndPermissions($role);
4034

4135
$roleKey = Config::get('roles.key');
4236

43-
$this->setRolesAndPermissions($role);
44-
4537
if (!($this->data[$roleKey] ?? null)) {
4638
$this->db->query("ALTER TABLE users ADD COLUMN $roleKey TEXT NOT NULL DEFAULT '[]'")->execute();
4739
}
@@ -134,10 +126,7 @@ public function unassign($role): void
134126
is_array($role) ? $role : [$role]
135127
);
136128

137-
$this->permissions = array_diff(
138-
$this->permissions,
139-
$this->getRolePermissions($role)
140-
);
129+
$this->permissions = $this->getRolePermissions($this->roles);
141130

142131
$this->db
143132
->update('users')
@@ -151,18 +140,27 @@ public function unassign($role): void
151140
/**
152141
* Set the roles and permissions for a user
153142
*
154-
* @param string|array $role The role(s) to set
143+
* @param string|array $roles The role(s) to set
155144
*/
156-
protected function setRolesAndPermissions($role): void
145+
protected function setRolesAndPermissions($roles): void
157146
{
158-
$this->roles = array_merge(
159-
$this->roles,
160-
is_array($role) ? $role : [$role]
161-
);
147+
if (is_string($roles)) {
148+
$roles = [$roles];
149+
}
150+
151+
foreach ($roles as $role) {
152+
if (!array_key_exists($role, Config::get('roles'))) {
153+
continue;
154+
}
162155

163-
foreach ($this->roles as $role) {
164-
$this->permissions = array_merge($this->permissions, $this->getRolePermissions($role));
156+
if (in_array($role, $this->roles)) {
157+
continue;
158+
}
159+
160+
$this->roles[] = $role;
165161
}
162+
163+
$this->permissions = $this->getRolePermissions($this->roles);
166164
}
167165

168166
/**
@@ -171,14 +169,20 @@ protected function setRolesAndPermissions($role): void
171169
* @param string|array $role
172170
* @return array
173171
*/
174-
protected function getRolePermissions($role): array
172+
protected function getRolePermissions($roles): array
175173
{
176-
if (is_string($role)) {
177-
return Config::get('roles')[$role] ?? [];
174+
$allRoles = Config::get('roles');
175+
176+
if (is_string($roles)) {
177+
return $allRoles[$roles] ?? [];
178178
}
179179

180-
return array_reduce($role, function ($acc, $role) {
181-
return array_merge($acc, Config::get('roles')[$role] ?? []);
182-
}, []);
180+
return array_values(array_unique(array_reduce($roles, function ($carry, $role) use ($allRoles) {
181+
if (isset($allRoles[$role])) {
182+
$carry = array_merge($carry, $allRoles[$role]); // Merge permissions for the selected role
183+
}
184+
185+
return $carry;
186+
}, [])));
183187
}
184188
}

0 commit comments

Comments
 (0)