diff --git a/plugins/baser-core/src/Model/Entity/User.php b/plugins/baser-core/src/Model/Entity/User.php index b0502f04ee..a757b6798d 100644 --- a/plugins/baser-core/src/Model/Entity/User.php +++ b/plugins/baser-core/src/Model/Entity/User.php @@ -144,8 +144,11 @@ public function isEnableLoginAgent(EntityInterface $targetUser): bool * 対象ユーザーに対して削除可能かどうか判定する * * 利用可能条件 - * - 自身がスーパーユーザーで対象がスーパーユーザーでない場合 - * - 自身がシステム管理ユーザーで対象がシステム管理ユーザーでない場合 + * - 自身に対する削除でない場合 + * - 自身がスーパーユーザーの場合は、対象がスーパーユーザーでない場合 + * - 自身がスーパーユーザーでない場合は、対象がシステム管理ユーザーでもスーパーユーザーでもない場合 + * + * 実際の削除可否は、コントローラーで行うアクセスルール判定を経た上で判定される * @param EntityInterface|User $targetUser * @return bool * @checked @@ -154,8 +157,13 @@ public function isEnableLoginAgent(EntityInterface $targetUser): bool */ public function isDeletableUser(EntityInterface $targetUser): bool { - return (($this->isSuper() && !$targetUser->isSuper()) || - ($this->isAdmin() && !$targetUser->isAdmin()) && !$targetUser->isSuper()); + if ($this->id === $targetUser->id) { + return false; + } + if ($this->isSuper()) { + return !$targetUser->isSuper(); + } + return !$targetUser->isAdmin() && !$targetUser->isSuper(); } /** diff --git a/plugins/baser-core/tests/TestCase/Model/Entity/UserTest.php b/plugins/baser-core/tests/TestCase/Model/Entity/UserTest.php index fec890724c..cb9447b319 100644 --- a/plugins/baser-core/tests/TestCase/Model/Entity/UserTest.php +++ b/plugins/baser-core/tests/TestCase/Model/Entity/UserTest.php @@ -108,35 +108,40 @@ public function testIsDeletableUser() //スーパーユーザー UserFactory::make(['id' => 2])->persist(); Configure::write('BcApp.superUserId', 2); - //Adminーザー + //システム管理ユーザー UserFactory::make(['id' => 3])->persist(); UsersUserGroupFactory::make(['user_id' => 3, 'user_group_id' => 1])->persist(); - //スーパーでもAdminでもないーザー + //スーパーユーザーでもシステム管理ユーザーでもないユーザー UserFactory::make(['id' => 4])->persist(); + //スーパーユーザーでもシステム管理ユーザーでもなく、かつ自身とは別のユーザー + UserFactory::make(['id' => 5])->persist(); - //自身がAdminを設定 + //自身がシステム管理ユーザーを設定 $this->User = $this->getTableLocator()->get('BaserCore.Users')->get(1, contain: 'UserGroups'); - //ターゲットがAdmin:false + //ターゲットがシステム管理ユーザー:false $this->assertFalse($this->User->isDeletableUser($this->getTableLocator()->get('BaserCore.Users')->get(3, contain: 'UserGroups'))); - //ターゲットがスーパーじゃない:true + //ターゲットがスーパーユーザーじゃない:true $this->assertTrue($this->User->isDeletableUser($this->getTableLocator()->get('BaserCore.Users')->get(4, contain: 'UserGroups'))); - //ターゲットがスーパー:false + //ターゲットがスーパーユーザー:false $this->assertFalse($this->User->isDeletableUser($this->getTableLocator()->get('BaserCore.Users')->get(2, contain: 'UserGroups'))); - //自身がスーパーを設定 + //自身がスーパーユーザーを設定 $this->User = $this->getTableLocator()->get('BaserCore.Users')->get(2, contain: 'UserGroups'); - //ターゲットがスーパー:false + //ターゲットがスーパーユーザー:false $this->assertFalse($this->User->isDeletableUser($this->getTableLocator()->get('BaserCore.Users')->get(2, contain: 'UserGroups'))); - //ターゲットがスーパーじゃない:true + //ターゲットがスーパーユーザーじゃない:true $this->assertTrue($this->User->isDeletableUser($this->getTableLocator()->get('BaserCore.Users')->get(1, contain: 'UserGroups'))); - //自身がスーパーでもAdminでもないを設定 :false + //自身がスーパーユーザーでもシステム管理ユーザーでもないを設定 $this->User = $this->getTableLocator()->get('BaserCore.Users')->get(4, contain: 'UserGroups'); $this->assertFalse($this->User->isDeletableUser($this->getTableLocator()->get('BaserCore.Users')->get(1, contain: 'UserGroups'))); $this->assertFalse($this->User->isDeletableUser($this->getTableLocator()->get('BaserCore.Users')->get(2, contain: 'UserGroups'))); $this->assertFalse($this->User->isDeletableUser($this->getTableLocator()->get('BaserCore.Users')->get(3, contain: 'UserGroups'))); + // 自身の削除は不可 $this->assertFalse($this->User->isDeletableUser($this->getTableLocator()->get('BaserCore.Users')->get(4, contain: 'UserGroups'))); + // 管理者でない他ユーザーの削除は可(アクセスルール判定は別途) + $this->assertTrue($this->User->isDeletableUser($this->getTableLocator()->get('BaserCore.Users')->get(5, contain: 'UserGroups'))); } /**