Php 默认的\u目标\u路径在Silex防火墙中如何工作?

Php 默认的\u目标\u路径在Silex防火墙中如何工作?,php,silex,Php,Silex,我在Silex中设置了防火墙,如下所示: $this -> register(new SecurityServiceProvider(), array( 'security.firewalls' => array( 'login' => array( 'pattern' => '^/admin/login$' ), 'admin' => array( 'patte

我在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')
    )
));
这是因为当我点击“管理”区域的页面时,我会被重定向到我的登录页面。但是,我已经开始在自定义AuthTheNotification成功处理程序中执行一些授权。我想使用内置方法
determiniterageurl
在成功时重定向,但它会一直重定向到“/”

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

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
显然,这不是我在防火墙中设置的。我的理解是,这应该与我访问系统时使用的防火墙中的内容相匹配。我使用的URL是“”

那么,如何使我在防火墙中设置的选项显示在对象中,以便我可以使用DeterminateTargetURL呢


非常感谢,Russell看起来你的问题是你的登录路径在安全区域内。您已将访问规则定义为
^/admin.*$
。这意味着任何以
/admin
开头的路由都需要
角色\u admin
,包括您的登录路由。要解决此问题,您需要从登录路径中删除安全性

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

'security.access\u rules'=>数组(
数组(“^/admin/login$”,“已匿名验证”),
数组(“^/admin.*$”,“ROLE_admin”)
)

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

这是我的错误。我正在使用自定义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);
    });
因此,身份验证成功时在
determinateTargetUrl
中使用的选项数组为空,因此具有默认值


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

是的,我可以毫无问题地登录,重定向是错误的。它似乎没有选择我设置的“默认目标路径”。我修改了access.rules,使登录页面通过匿名身份验证,因为这样可能更正确。