与其尝试检查每个路由/控制器的访问权限,不如简单地不要为那些无权访问的人显示您的菜单项。创建一个返回用户类型的服务类。
services.yml
app_security.access.manager:
class: AppBundle\Services\SecurityAccessManager
arguments: [@security.authorization_checker,@security.token_storage]
SecurityAccessManager.php
<?php
namespace AppBundle\Services;
use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorage;
use Symfony\Component\Security\Core\Authorization\AuthorizationChecker;
class SecurityAccessManager
{
private $authorizationChecker;
private $tokenStorage;
public function __construct(AuthorizationChecker $authorizationChecker,TokenStorage $tokenStorage)
{
$this->authorizationChecker = $authorizationChecker;
$this->tokenStorage = $tokenStorage;
}
public function getUser()
{
return $this->tokenStorage->getToken()->getUser();
}
public function isAdmin()
{
if($this->authorizationChecker->isGranted('ROLE_ADMIN') !== true) {
return false;
} else {
return true;
}
}
}
然后在您的菜单生成器中,您需要注入该类并检查权限:
这是一个带有 KNP 菜单的示例:
app.menu.builder
class: AppBundle\Menu\MenuBuilder
arguments: [@knp_menu.factory,@medapp_security.access.manager]
还有菜单生成器
class MenuBuilder extends ContainerAware
{
/**
* @var FactoryInterface
*/
private $factoryInterface;
private $securityAccessManager;
public function __construct(FactoryInterface $factoryInterface, SecurityAccessManager $securityAccessManager)
{
$this->factoryInterface = $factoryInterface;
$this->securityAccessManager = $securityAccessManager;
}
...
$menu->addChild('user link',..);
if ($this->securityAccessManager->isAdmin()) $menu->addChild('admin link',..);