PHP Symfony-仅向对象的所有者提供凭据

PHP Symfony-仅向对象的所有者提供凭据,php,security,symfony1,Php,Security,Symfony1,我正试图对symfony的用户身份验证进行思考。需要有关最佳实践的建议 apps/frontend/modules/mymodule/config/security.yml 何时何地设置$this->getUser()->addCredential('owner')? 在过滤器链的过滤器中 如果我将其设置在那里,我何时再次删除凭据? 我可以在同一个过滤器中删除,如果用户不是该对象的所有者,但一旦用户编辑了一个对象,他将拥有所有者凭据,直到他尝试编辑他不拥有的内容。这有缺点吗 或者有没有办法将所需

我正试图对symfony的用户身份验证进行思考。需要有关最佳实践的建议

apps/frontend/modules/mymodule/config/security.yml

何时何地设置
$this->getUser()->addCredential('owner')
? 在过滤器链的过滤器中

如果我将其设置在那里,我何时再次删除凭据? 我可以在同一个过滤器中删除,如果用户不是该对象的所有者,但一旦用户编辑了一个对象,他将拥有所有者凭据,直到他尝试编辑他不拥有的内容。这有缺点吗

或者有没有办法将所需的凭据设置为对象的id?像

edit:
  is_secure: true
  credentials: %%request_id%%
然后在登录时为所有ID添加用户凭据

如有任何见解,将不胜感激


更新1:

你喜欢这个工作吗?现在无法测试代码是否有效这是最佳做法吗

apps/frontend/config/filters.yml

apps/frontend/lib/addOwnerCredentials.class.php


更新2:
添加到代码段,以便在需要所有者凭据之后立即删除它们,这样用户在会话中就不会有不必要的凭据

我将我的自定义筛选器放在安全筛选器之前,它向用户添加任意凭据,而不是替换它们。这似乎是我们两种方法之间的唯一区别:)


因此,我想说是的,它(我的意思是UPD1)是最佳实践。

我知道我可以在executeEdit方法中根据用户id检查对象的用户id,但这似乎是一种解决方法。寻找最佳实践。我做了一件类似的事情,在请求对象上调用了一个isOwnedBy方法,并将其传递给当前用户。具有用户id字段的类通过父类中的方法自动处理。对于更复杂的检查来说,这是多余的。“带有用户id字段的类是通过父类中的方法自动处理的”这是您的实现还是symfony自动完成的?如果它是symfony功能,我在哪里可以阅读?我找不到hasCredential()方法。它的定义是什么?已尝试sfWebRequest和sfRequest。无论如何,我觉得我的方法有点“干净”。谢谢你的意见!这是我添加的一种方法。hasCredential方法位于sfUser类中。。。与您在代码中调用的方法相同!哦!现在我明白了!当我还是个孩子的时候,一定是头撞得太重了谢谢你的方法。我会试着看看我是否比我的更喜欢它。我只是觉得它属于安全,因为它做安全检查;)谢谢你的回答,我会把问题留一点时间,看看是否有更多的意见。PS:我不更换过滤器,我正在扩展它
class addOwnerCredentials extends sfBasicSecurityFilter
我明白你的意思。但是如果你想增强安全过滤器,你必须在
addOwnerCredentials
filter类中重新实现它的功能。如果我写了一个sfAdvancedSecurityFilter,它扩展了sfBasicSecurityFilter,我必须更改我的addOwnerCredentials来扩展高级过滤器,这是真的。谢谢你的意见。
edit:
  is_secure: true
  credentials: %%request_id%%
// ...

security:
  class: addOwnerCredentials

// ...
class addOwnerCredentials extends sfBasicSecurityFilter
{

  function execute($filterChain)
  {
    $context = $this->getContext();
    $request = $context->getRequest();
    $user = $context->getUser();

    $user_ids = $user->getAllOwnership();

    // Add owner credential for current user or remove if he has it but shouldn't
    if (in_array($request->getParameter('id'), $user_ids)) {
      $user->addCredential('owner');
    }
    elseif ($user->hasCredential('owner')) {
      $user->removeCredential('owner');
    }

    // Continue down normal filterChain
    parent::execute($filterChain);

    // On the way back, before rendering, remove owner credential again
    // The code after the call to $filterChain->execute() executes after the
    // action execution and before the rendering.
    if ($user->hasCredential('owner')) {
      $user->removeCredential('owner');
    }
  }

}