我在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
答案 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添加一组选项,它可以正常工作。这没关系,因为每个自定义处理程序都链接到不同的防火墙。