我正在尝试编写一个需要访问用户权限级别的事件侦听器。在控制器中,我使用以下代码
代码:
$securityContext = $this->container->get('security.context');
if($securityContext->isGranted('ROLE_USER')){
//Do Something
}
但是在控制器之外,我无法弄清楚如何获取安全上下文。是否可以?
最好的方法是通过Service Container使用(如 phpisuber 所说)依赖注入。但是,不要注入整个容器(这被认为是不好的做法,因为它会使整个类的可测试性降低并破坏松散耦合),您应该像这样注入服务:security.context
acme_foo.bar_service:
class: %acme_foo.bar_service.class%
arguments:
- @security.context
您的服务可以是这样的:
<?php
namespace Acme\FooBundle\Service;
use Symfony\Component\Security\Core\SecurityContext;
class BarService
{
/**
* @var SecurityContext
*/
protected $context;
/**
* @param SecurityContext $context
*/
public function __construct($context)
{
$this->context = $context;
}
public function doSomething()
{
return $this->context->isGranted('ROLE_USER');
}
}
有两种方法可以在控制器之外获取它:
依赖注入:
这是正确的方法,您只需要在此处的文档中即可。
mybundle.model.mymodel:
class: %mybundle.model.myclass%
arguments: [@servicecontainer]
又快又脏:
global $kernel;
$securityContext = $kernel->getContainer()->get('security.context');
我知道这篇文章有点过时了,但它仍然是谷歌上的第一批结果之一。
这篇文章中的答案引用了SecurityContext
该类,从 Symfony 2.6 开始不再支持该类。由于类弃用,此帖子的公认答案具有误导性。
从这个答案试试这个代码:
use Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use YourNameSpace\UserBundle\Entity\User;
class LoginController extends Controller{
public function registerAction()
{
$user = //Handle getting or creating the user entity likely with a posted form
$token = new UsernamePasswordToken($user, null, 'main', $user->getRoles());
$this->get('security.token_storage')->setToken($token);
$this->get('session')->set('_security_main', serialize($token));
}
}