【问题标题】:Symfony2 : controlling access to a ressourceSymfony2:控制对资源的访问
【发布时间】:2014-09-23 16:15:19
【问题描述】:

我正在开发一个应用程序,其中每个用户都可以访问许多 Project(s) 并且每个 Project 可能包含许多 Campaign(s) 等等。 然后我的网址看起来像:

/project/{project}/member

/project/{project}/member/{member}

/project/{project}/campaign

/project/{project}/campaign/{campaign}

/project/{project}/campaign/{campaign}/plot

/project/{project}/campaign/{campaign}/plot/{plot}

我了解到@ParamConverter 可以处理这些 URL 以满足我的需要。

--问题--

我正在寻找一种方法,让任何访问项目的用户都被授权...而无需复制每个控制器内的代码。 一个用户可以绑定到多个项目,通过 (ROLE_MEMBERROLE_ADMIN) 授予。

【问题讨论】:

  • 如果你使用ACL你可以检查jms/security-extra-bundlePreAuthorize注解的使用。否则,您可以实现自定义ParamConverter,检查注入SecurityContext 服务的正确角色
  • 使用选民。我遇到了同样的问题。我所做的是:让选民只对某个属性进行投票,例如:REQUEST_ACCESS.将请求注入选民。根据请求路径。并添加 - { path: ^/ ,roles: REQUEST_ACCESS } 到防火墙配置的 access_control 部分。

标签: php security symfony


【解决方案1】:

我建议根据http://symfony.com/doc/current/cookbook/service_container/event_listener.html 让自己成为 KernelEvents::CONTROLLER 侦听器

您的侦听器将在路由匹配到控制器之后但在调用控制器的操作方法之前被调用。 request 参数将设置您的项目/活动等变量。

然后我建议让这个监听器加载到您的项目和活动中,而不是使用参数转换器。我只是觉得它会更干净一些。您需要做的就是检索它们,然后将它们存储回您的请求对象。然后它们将最终出现在您的控制器操作方法中。

获得对象后,您可以使用安全上下文检查角色,并在需要时抛出 AccessDenied 异常。

我实际上会将权限检查的内容转移给一个或多个安全选民http://symfony.com/doc/current/cookbook/security/voters_data_permission.html

这将为您提供更细粒度的访问控制,而无需求助于完整的访问控制列表。这也意味着您可以根据需要在模板等其他地方进行角色检查。

【讨论】:

    猜你喜欢
    • 2012-02-10
    • 2019-10-11
    • 2013-08-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-14
    • 2013-08-28
    相关资源
    最近更新 更多