Php Symfony2:控制对资源的访问

Php Symfony2:控制对资源的访问,php,security,symfony,Php,Security,Symfony,我正在开发一个应用程序,其中每个用户都可以访问许多项目,每个项目可能包含许多活动,等等。 然后我的URL看起来像: /项目/{project}/member /项目/{project}/member/{member} /项目/{project}/campaign /项目/{project}/campaign/{campaign} /项目/{project}/campaign/{campaign}/plot /项目/{project}/campaign/{campaign}/plot/{plot}

我正在开发一个应用程序,其中每个用户都可以访问许多
项目
,每个
项目
可能包含许多
活动
,等等。 然后我的URL看起来像:

/项目/
{project}
/member

/项目/
{project}
/member/
{member}

/项目/
{project}
/campaign

/项目/
{project}
/campaign/
{campaign}

/项目/
{project}
/campaign/
{campaign}
/plot

/项目/
{project}
/campaign/
{campaign}
/plot/
{plot}

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

--问题--

我正在寻找一种方法,使任何访问项目的用户都有权。。。不复制每个控制器内的代码。
一个用户可以绑定到多个项目,并被授予(
ROLE\u MEMBER
ROLE\u ADMIN
)权限。

我建议自己成为一名KernelEvents::CONTROLLER侦听器

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

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

一旦拥有了对象,就可以使用安全上下文来检查角色,并在需要时抛出AccessDenied异常

实际上,我会将许可检查的内容转移给一个或多个安全选民


这将为您提供更细粒度的访问控制,而无需求助于完整的访问控制列表。这还意味着,如果需要,您可以在其他位置(如模板)执行角色检查。

如果使用ACL,您可以检查
jms/security额外捆绑包的
PreAuthorize
注释的使用情况。否则,您可以实现自定义的
ParamConverter
,检查正确的角色注入
SecurityContext
服务使用投票者。我也遇到了同样的问题。我所做的是:使投票者仅对某个属性进行投票,例如:请求访问。将请求注入投票者。根据请求检查访问并将-{path:^/,roles:REQUEST_ACCESS}添加到防火墙配置的访问控制部分。