Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -102,7 +102,7 @@ public function set(Request $request): RedirectResponse|array
/**
* @return RedirectResponse|array<string, mixed>
*/
#[Route(path: '/%eccube_admin_route%/setting/system/two_factor_auth/edit', name: 'admin_setting_system_two_factor_auth_edit', methods: ['GET', 'POST'])]
#[Route(path: '/%eccube_admin_route%/two_factor_auth/edit', name: 'admin_setting_system_two_factor_auth_edit', methods: ['GET', 'POST'])]
#[Template(template: '@admin/Setting/System/two_factor_auth_edit.twig')]
public function edit(Request $request): RedirectResponse|array
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,12 +15,14 @@

namespace Eccube\Tests\Web\Admin\Setting\System;

use Eccube\Entity\AuthorityRole;
use Eccube\Entity\Member;
use Eccube\Repository\MemberRepository;
use Eccube\Service\TwoFactorAuthService;
use Eccube\Tests\Web\Admin\AbstractAdminWebTestCase;
use RobThree\Auth\TwoFactorAuth;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;

final class TwoFactorAuthControllerTest extends AbstractAdminWebTestCase
{
Expand Down Expand Up @@ -211,4 +213,48 @@ public function testSetRedirectsToAuthWhenTwoFactorAuthKeyAlreadyConfigured()
'2FAキー設定済みユーザーが未認証で設定画面にアクセスした場合、認証画面にリダイレクトされるべき。実際のレスポンス: Status='.$response->getStatusCode().', Location='.$response->headers->get('Location')
);
}

/**
* 回帰テスト(#6406): 権限管理で "/setting" が拒否URLに設定されていても、
* 2段階認証の再設定画面にアクセスできること。
*
* 修正前は edit ルートが "/setting/system/two_factor_auth/edit" だったため
* 拒否URL "/setting" の前方一致で AuthorityVoter に 403 で弾かれていた。
*/
public function testEditIsNotForbiddenWhenSettingUrlIsDenied()
{
if (!$this->twoFactorAuthService->isEnabled()) {
$this->markTestSkipped('2FAが無効のためスキップ');
}

// 2FA設定済みの新規メンバーを作成
$Member = $this->createMember();
$Member->setTwoFactorAuthEnabled(true);
$Member->setTwoFactorAuthKey($this->twoFactorAuthService->createSecret());
$this->entityManager->persist($Member);

// メンバーの権限に対して "/setting" 配下を拒否する権限設定を追加
$AuthorityRole = new AuthorityRole();
$AuthorityRole
->setDenyUrl('/setting')
->setAuthority($Member->getAuthority())
->setCreator($Member)
->setCreateDate(new \DateTime())
->setUpdateDate(new \DateTime());
$this->entityManager->persist($AuthorityRole);
$this->entityManager->flush();

// 新しいMemberでログイン
$this->loginTo($Member);

// 2段階認証の再設定画面にアクセス
$this->client->request(Request::METHOD_GET, $this->generateUrl('admin_setting_system_two_factor_auth_edit'));

// "/setting" 拒否設定下でも 403(アクセス拒否) にならないこと
$this->assertNotSame(
Response::HTTP_FORBIDDEN,
$this->client->getResponse()->getStatusCode(),
'"/setting" が拒否URLでも2段階認証の再設定画面はアクセス拒否されないべき'
);
}
}
Loading