3

我正在尝试编写一个需要访问用户权限级别的事件侦听器。在控制器中,我使用以下代码

代码:

$securityContext = $this->container->get('security.context');

if($securityContext->isGranted('ROLE_USER')){
    //Do Something
}

但是在控制器之外,我无法弄清楚如何获取安全上下文。是否可以?

4

3 回答 3

20

最好的方法是通过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');
    }
}
于 2013-04-10T09:52:28.590 回答
5

有两种方法可以在控制器之外获取它:

依赖注入:

这是正确的方法,您只需要在此处的文档中即可。

mybundle.model.mymodel:
class: %mybundle.model.myclass%
arguments: [@servicecontainer]

又快又脏:

global $kernel;
$securityContext = $kernel->getContainer()->get('security.context');
于 2013-04-09T16:49:36.940 回答
0

我知道这篇文章有点过时了,但它仍然是谷歌上的第一批结果之一。

这篇文章中的答案引用了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));
    }
}
于 2018-03-20T17:51:56.857 回答