<?php
/*
* This file is part of EC-CUBE
*
* Copyright(c) EC-CUBE CO.,LTD. All Rights Reserved.
*
* http://www.ec-cube.co.jp/
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Eccube\Security\Voter;
use Eccube\Common\EccubeConfig;
use Eccube\Entity\Member;
use Eccube\Repository\AuthorityRoleRepository;
use Symfony\Component\HttpFoundation\RequestStack;
use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
use Symfony\Component\Security\Core\Authorization\Voter\VoterInterface;
class AuthorityVoter implements VoterInterface
{
/**
* @var AuthorityRoleRepository
*/
protected $authorityRoleRepository;
/**
* @var RequestStack
*/
protected $requestStack;
/**
* @var EccubeConfig
*/
protected $eccubeConfig;
public function __construct(
AuthorityRoleRepository $authorityRoleRepository,
RequestStack $requestStack,
EccubeConfig $eccubeConfig
) {
$this->authorityRoleRepository = $authorityRoleRepository;
$this->requestStack = $requestStack;
$this->eccubeConfig = $eccubeConfig;
}
public function vote(TokenInterface $token, $object, array $attributes)
{
$path = null;
try {
$request = $this->requestStack->getMainRequest();
} catch (\RuntimeException $e) {
// requestが取得できない場合、棄権する(テストプログラムで不要なため)
return VoterInterface::ACCESS_ABSTAIN;
}
if (is_object($request)) {
$path = rawurldecode($request->getPathInfo());
}
$Member = $token->getUser();
if ($Member instanceof Member) {
// 管理者のロールをチェック
$AuthorityRoles = $this->authorityRoleRepository->findBy(['Authority' => $Member->getAuthority()]);
$adminRoute = $this->eccubeConfig->get('eccube_admin_route');
foreach ($AuthorityRoles as $AuthorityRole) {
// 許可しないURLが含まれていればアクセス拒否
try {
// 正規表現でURLチェック
$denyUrl = str_replace('/', '\/', $AuthorityRole->getDenyUrl());
if (preg_match("/^(\/{$adminRoute}{$denyUrl})/i", $path)) {
return VoterInterface::ACCESS_DENIED;
}
} catch (\Exception $e) {
// 拒否URLの指定に誤りがある場合、エスケープさせてチェック
$denyUrl = preg_quote($AuthorityRole->getDenyUrl(), '/');
if (preg_match("/^(\/{$adminRoute}{$denyUrl})/i", $path)) {
return VoterInterface::ACCESS_DENIED;
}
}
}
}
return VoterInterface::ACCESS_GRANTED;
}
}