Skip to content

Commit 7dee857

Browse files
mohamedds-12drbyte
andauthored
Fixed bug of loading user roles of different teams to current team (#2803)
* Fixed calling $this->roles property which could load old roles * Added reloading roles before asigning role if teams feature is enabled --------- Co-authored-by: Chris Brown <[email protected]>
1 parent 18825c6 commit 7dee857

File tree

3 files changed

+16
-0
lines changed

3 files changed

+16
-0
lines changed

src/Traits/HasRoles.php

+5
Original file line numberDiff line numberDiff line change
@@ -154,6 +154,11 @@ public function assignRole(...$roles)
154154
[app(PermissionRegistrar::class)->teamsKey => getPermissionsTeamId()] : [];
155155

156156
if ($model->exists) {
157+
if (app(PermissionRegistrar::class)->teams) {
158+
// explicit reload in case team has been changed since last load
159+
$this->load('roles');
160+
}
161+
157162
$currentRoles = $this->roles->map(fn ($role) => $role->getKey())->toArray();
158163

159164
$this->roles()->attach(array_diff($roles, $currentRoles), $teamPivot);

tests/HasRolesTest.php

+6
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
use Spatie\Permission\Events\RoleDetached;
1414
use Spatie\Permission\Exceptions\GuardDoesNotMatch;
1515
use Spatie\Permission\Exceptions\RoleDoesNotExist;
16+
use Spatie\Permission\PermissionRegistrar;
1617
use Spatie\Permission\Tests\TestModels\Admin;
1718
use Spatie\Permission\Tests\TestModels\SoftDeletingUser;
1819
use Spatie\Permission\Tests\TestModels\User;
@@ -394,6 +395,11 @@ public function it_does_not_run_unnecessary_sqls_when_assigning_new_roles()
394395
DB::disableQueryLog();
395396

396397
$necessaryQueriesCount = 2;
398+
399+
// Teams reloads relation, adding an extra query
400+
if (app(PermissionRegistrar::class)->teams) {
401+
$necessaryQueriesCount++;
402+
}
397403

398404
$this->assertCount($necessaryQueriesCount, DB::getQueryLog());
399405
}

tests/TeamHasRolesTest.php

+5
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,11 @@ public function it_can_assign_same_and_different_roles_on_same_user_different_te
5555
setPermissionsTeamId(1);
5656
$this->testUser->assignRole('testRole', 'testRole2');
5757

58+
// explicit load of roles to assert no mismatch
59+
// when same role assigned in diff teams
60+
// while old team's roles are loaded
61+
$this->testUser->load('roles');
62+
5863
setPermissionsTeamId(2);
5964
$this->testUser->assignRole('testRole', 'testRole3');
6065

0 commit comments

Comments
 (0)