SecurityContext-> isGranted()在控制器中工作但不在服务中

时间:2014-07-31 12:56:06

标签: symfony security-context

我的应用程序的公共区域可以访问,无需登录或身份验证,当我在控制器if ($securityContext->isGranted('IS_AUTHENTICATED_ANONYMOUSLY'))中运行此代码时,我得到true预期。

然后我有一个像这样定义的服务:

main.services:
    class: App\MainBundle\Services\MainServices
    arguments: [ @doctrine.orm.entity_manager, @security.context, @service_container ]

但是当我运行这段代码时:

public function __construct(EntityManager $em, SecurityContext $securityContext, Container $container) {
    $this->em = $em;
    $this->container = $container;
    $this->securityContext = $securityContext;

    error_log("MAIN");
    if ($securityContext->isGranted('IS_AUTHENTICATED_ANONYMOUSLY'))
        error_log("MAIN Anon");
    else
        error_log("MAIN no anon");
}

我得到一个例外:

  

未捕获的异常' Symfony \ Component \ Security \ Core \ Exception \ AuthenticationCredentialsNotFoundException' with message'安全上下文不包含身份验证令牌。一个可能的原因可能是没有为此URL配置防火墙。'

在控制器中的第一个命令之后立即调用该服务。

谢谢

2 个答案:

答案 0 :(得分:2)

在安全令牌创建之前初始化服务时,可能会发生此错误。尽量不要在构造函数中检查访问权限,将此检查移动到从控制器调用的方法。

答案 1 :(得分:2)

仅在定义了令牌并且@Ziumin为wright时才使用它。

public function __construct(EntityManager $em, SecurityContext $securityContext, Container $container) {
    $this->em = $em;
    $this->container = $container;
    $this->securityContext = $securityContext;

    error_log("MAIN");

    $token = $this->securityContext->getToken();

    if (is_object($token)) {
        if ($securityContext->isGranted('IS_AUTHENTICATED_ANONYMOUSLY'))
            error_log("MAIN Anon");
        else
            error_log("MAIN no anon");
    }
}