default_target_path如何在Silex防火墙中运行?

时间:2015-02-28 11:19:38

标签: php silex

我在Silex中设置了防火墙,如下所示:

$this -> register(new SecurityServiceProvider(), array(
    'security.firewalls' => array(
        'login' => array(
            'pattern' => '^/admin/login$'
        ),
        'admin' => array(
            'pattern' => '^/admin.*$',
            'form' => array(
                'login_path' => '/admin/login',
                'check_path' => '/admin/security/validate',
                'default_target_path' => "/admin",
                'always_use_default_target_path' => true
            ),
            'logout' => array(
                'logout_path' => '/admin/security/logout'
            ),
            'users' => $app -> share(function () use ($app) {
                return new \Turtle\Providers\UserProvider($app);
            })
        )
    ),
    'security.access_rules' => array(
        array('^/admin.*$', 'ROLE_ADMIN')
    )
));

当我点击“管理员”页面中的页面时区域我被重定向到我的登录页面。但是我已经开始在我的自定义AuththenticationSuccess处理程序中进行一些授权。我想使用内置方法determineTargeUrl重定向成功,但它会重定向到' /'。

经过一些调试后,我发现该方法使用的对象中的选项具有以下内容:

array (size=5)
  'always_use_default_target_path' => boolean false
  'default_target_path' => string '/' (length=1)
  'login_path' => string '/login' (length=6)
  'target_path_parameter' => string '_target_path' (length=12)
  'use_referer' => boolean false

显然,这不是我在防火墙中设置的内容。据我所知,这应该与我在访问系统时使用的防火墙中的内容相匹配。我使用的网址是' http://localhost/admin'。

那么如何制作它以便我在防火墙中设置的选项出现在对象中,以便我可以使用determineTargetUrl?

非常感谢Russell

2 个答案:

答案 0 :(得分:0)

看起来您的问题是您的登录路线位于您的安全区域内。您已将访问规则定义为^/admin.*$。这意味着以/admin开头的任何路由都需要ROLE_ADMIN,包括您的登录路由。要解决此问题,您需要从登录路由中删除安全性。

在管理规则上方添加新的访问规则。

'security.access_rules' => array(
    array('^/admin/login$', 'IS_AUTHENTICATED_ANONYMOUSLY'),
    array('^/admin.*$', 'ROLE_ADMIN')
)

修改:再次阅读您的问题后,我可能误会了您。听起来您可以成功登录,但在成功登录后会被重定向到错误的位置。那是对的吗?如果是这样,我将删除此答案。

答案 1 :(得分:0)

这是我的错。我正在使用自定义AuthenticationSuccess和AuthenticationFailure处理程序,当我声明它时,我忽略了将任何选项传递给它们:

    $app['security.authentication.success_handler.admin'] = $app -> share(function() use ($app) {
        return new AuthenticationSuccessHandler($app['security.http_utils'], array(), $app);
    });

    $app['security.authentication.failure_handler.admin'] = $app -> share(function() use ($app) {
        return new AuthenticationFailureHandler($app['kernel'], $app['security.http_utils'], array(), $app);
    });

因此,determineTargetUrl中用于身份验证成功的options数组为空,因此具有默认值。

通过向AuthenticationSuccessHandler添加一组选项,它可以正常工作。这没关系,因为每个自定义处理程序都链接到不同的防火墙。