通过@SecureParam的Symfony2.3自定义选民

时间:2014-11-24 15:53:28

标签: security symfony annotations

写了一个自定义选民并注册了作为服务(项目中的第一个自定义选民), 用以下方法测试:

/**
 * @Route("/delete/{id}", name="product_delete")
 * @Method("GET")
 */
public function deleteAction(Product $product)
{
    if (!$this->get('security.context')->isGranted("PRODUCT_DELETE", $product)) {
        throw new \Exception('ACCESS DENIED');
    }
}

它按预期工作。然而,

/**
 * @Route("/delete/{id}", name="product_delete")
 * @Method("GET")
 * @SecureParam(name="product", permissions="PRODUCT_DELETE")
 */
public function deleteAction(Product $product)
{
}

无论SecureParam注释如何,选民都会收到一个包含以下参数的电话:

$attributes = ["ROLE_USER"];
$object instanceof \Symfony\Component\HttpFoundation\Request

我此刻正撞在墙上......

1 个答案:

答案 0 :(得分:1)

使用Symfony2,有一个access listener(在kernel.request事件上),它将根据" security.access_control"检查当前的安全上下文。参数(通常位于app / config / security.yml中)。

此侦听器使用access decision manager,负责向注册选民委派对象(请求)和配置的角色(属性),然后做出授予或拒绝访问的决定。其中一个选民是RoleVoter,负责说当前用户是否具有给定的角色。

这就是你的选民收到这些论点的原因。它应该通过返回VoterInterface :: ACCESS_ABSTAIN来忽略它们,因为它可能不是它的目的来处理它们。

我希望我足够清楚。