1

我正在尝试将我的应用程序从 Silex 迁移到 Symfony。

我正在使用 Silexbefore(...)方法注册要在执行操作本身之前执行的方法,以检查是否设置了某些会话变量。
我可以对 Symfony 中的事件监听器做类似的事情,但是控制器需要不同的 before 方法来包含操作方法。

目前,Silex 看起来如下所示:

$controllers = $app['controllers_factory'];
$controllers->before($this->guard('user'));

$controllers->get('/switch/{gameId}', $this->action('switch'))
    ->bind('game:switch')
    ->value('gameId', 0)
    ->assert('gameId', '\d+');
$controllers->match('/register', $this->action('register'))
    ->before($this->guard('player'))
    ->bind('game:register');

return $controllers;

如果之前选择了容器对象,则完全经过身份验证的用户可以访问某些控制器操作。所以最后看守方法是一种访问控制。
如果用户在没有选择对象的情况下访问操作,我想将用户重定向到选择或类似内容。

一种想法是将其实现为角色并在会话期间临时授予角色。
我可以将它与access_denied_url调用的自定义控制器或更好的方法结合使用来实现自己的access_denied_handler来处理访问控制处理程序拒绝的访问。
似乎不可能在用户登录时临时存储角色。

另一种思路是使用access_control下的allow_if表达式,不过还有一点,如果出现异常(access denied,如何实现Access Denied Handler),我该如何反应?

您将如何实施这样的系统?
感谢您的建议中的任何提示!

4

1 回答 1

0

经过更多研究后,我实现了事件侦听器解决方案以使某些东西正常工作,并实现了一个接口,该接口定义了一些方法来处理不同类型的检查:

interface GameGuardController
{
    // returns the controller level of check
    public function getControllerLevel();

    // returns an array to override level for actions
    public function getMethodLevel();
}

使用RouterInterface的匹配method我得到路由数据,并且可以从控制器中提取动作名称来访问覆盖方法级别。

于 2014-08-15T18:07:47.937 回答