如何基于会话变量实现授权系统?

时间:2014-08-09 13:38:54

标签: php symfony silex symfony-2.5 symfony-security

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

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

目前,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否认处理程序)?

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

1 个答案:

答案 0 :(得分:0)

经过更多的研究后,我实现了event listener解决方案以使某些工作和界面定义了一些方法来处理不同类型的检查:

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

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

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

相关问题