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