我想访问security.yml中配置的安全配置(默认情况下),特别是我需要路由名称或(更好)生成的URL到登录。当使用FOS用户(我现在正在使用它)时,其名为“fos_user_security_login”,带有“/ login”URL。我需要它与内核收听的事件中的事件请求(请求)URL进行比较。
我可以在我的内核侦听器类中对此设置进行硬编码,如下所示:
public function onKernelResponse(\Symfony\Component\HttpKernel\Event\FilterResponseEvent $event)
{
if ($originalResponse->headers->has('location')
&& $originalResponse->headers->get('location') === $router->generate('fos_user_security_login', array(), true))
{
//...
}
}
但是,如果我将来将此设置更改为另一个设置,例如,使用我的自定义登录处理程序到某个“/ user / login”路径?这就是为什么我想阅读登录的安全设置。
我如何在Symfony中执行此操作?
答案 0 :(得分:2)
如果我是你,我会避免阅读此安全设置,因为您可以拥有多个登录多个防火墙,因此您的收听者必须听取所有这些(可能不是您想要的)或人为限制到硬编码的防火墙。此外,这会将您的实现与Symfony的安全组件联系起来,您应该避免使用它。
一种易于重复使用的方法是,将要检查的URL或路由名称作为参数添加到侦听器,并通过Symfony的服务容器传递,然后只需将请求与该值进行比较:
class LoginListener
{
/**
* @var string
*/
protected $loginUrl;
/**
* @param string $loginUrl
*/
public function __construct($loginUrl)
{
// You can even fallback to default if you like:
if (empty($loginUrl)) {
$loginUrl = '/login';
}
$this->loginUrl = $loginUrl;
}
// [...] your comparison just against $this->loginUrl
}
然后,您可以使用捆绑包的配置将正确的参数传递给该侦听器。
通过这种方式,您可以轻松地在Symfony之外重复使用它,例如在Silex,而不是与Symfony的安全组件绑定。此外,如果您想要检查多个网址,您可以将其设为数组并指定不同的登录网址,例如当你有多个登录机制时。
编辑:在您的捆绑包配置中,您可以检查参数并定义回退或错误消息或其他内容(请参阅Getting and Setting Container Parameters)。
编辑:
in parameters.yml:
custom_login_path: /my_login
在security.yml中:
main:
pattern: ^/
form_login:
provider: fos_userbundle
csrf_provider: security.csrf.token_manager # Use form.csrf_provider instead for Symfony <2.4
login_path: %custom_login_path%
在routing.yml中:
fos_user:
resource: "@FOSUserBundle/Resources/config/routing/all.xml"
# Make sure this follows "fos_user" so it takes precendece over the default
fos_user_security_login:
path: %custom_login_path%
defaults: { _controller: FOSUserBundle:Security:login }
在config.yml中:
# config for listener in your bundle
my_bundle:
login_path: %custom_login_path%