From b971b90fb485922e41833d5adbdf96be0fd95777 Mon Sep 17 00:00:00 2001 From: sakaguchi Date: Mon, 1 Jun 2026 22:12:22 +0900 Subject: [PATCH] =?UTF-8?q?fix=20#3769=20=E3=80=90=E3=82=A2=E3=82=AF?= =?UTF-8?q?=E3=82=BB=E3=82=B9=E3=83=AB=E3=83=BC=E3=83=AB=E3=82=B0=E3=83=AB?= =?UTF-8?q?=E3=83=BC=E3=83=97=E3=80=91=E3=82=B7=E3=82=B9=E3=83=86=E3=83=A0?= =?UTF-8?q?=E7=AE=A1=E7=90=86=E8=80=85=E4=BB=A5=E5=A4=96=E3=81=AB=E3=83=A6?= =?UTF-8?q?=E3=83=BC=E3=82=B6=E3=83=BC=E7=AE=A1=E7=90=86=E3=82=B0=E3=83=AB?= =?UTF-8?q?=E3=83=BC=E3=83=97=E3=81=A7=E5=89=8A=E9=99=A4=E6=A8=A9=E9=99=90?= =?UTF-8?q?=E3=82=92=E4=B8=8E=E3=81=88=E3=81=A6=E3=82=82=E3=83=A6=E3=83=BC?= =?UTF-8?q?=E3=82=B6=E3=83=BC=E5=89=8A=E9=99=A4=E3=81=A7=E3=81=8D=E3=81=AA?= =?UTF-8?q?=E3=81=84=E4=BB=B6=E3=82=92=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- plugins/baser-core/src/Model/Entity/User.php | 16 +++++++++--- .../tests/TestCase/Model/Entity/UserTest.php | 25 +++++++++++-------- 2 files changed, 27 insertions(+), 14 deletions(-) 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'))); } /**