我使用Symfony-2来实现我的应用程序。
我需要我的登录和注销路由有一些占位符,但我没有设法在路由中定义它。Yml 和安全性。yml 文件。
我想要这样的:www.mysite.com/{client_slug}/panel
及其下面的其他安全页面:www.mysite.com/{client_slug}/panel/.*
当有人试图导航到其中一个页面时,他/她应该被重定向到:www.mysite.com/{client_slug}/login
在点击logout之后,用户应该被重定向到类似的东西:www.mysite.com/{client_slug}/goodbye
我尝试了几件事(http://forum.symfony-project.org/viewtopic.php?f=23&t=37809),但目前我唯一实现的是,在我的登录url文本{client_slug}出现:
www.mysite.com/my-cliend-slug/panel
重定向到www.mysite.com/{client_slug}/login
security.yml
firewalls:
main:
pattern: /.*
form_login:
check_path: /login_check
login_path: _security_login
logout:
path: /logout
target: /goodbye
security: true
anonymous: true
routing.yml
_security_login:
pattern: /{_client_slug}/login
defaults: { _controller: MyAppBackendBundle:Security:login }
_security_check:
pattern: /login_check
_security_logout:
pattern: /logout
_admin_panel:
pattern: /{_client_slug}/panel
defaults: { _controller: MyAppBackendBundle:AdminPanel:index }
任何想法?
我遇到了完全相同的问题。我已经阅读了这里的所有内容(http://forum.symfony-project.org/viewtopic.php?f=23&t=37809),对我来说,它可以与一些额外的行一起工作。
这是我的安全。yml
login_area:
pattern: ^/[A-Za-z0-9-_]+/login$
anonymous: ~
secured_area:
pattern: ^/[A-Za-z0-9-_]+/.*
form_login:
login_path: login
check_path: login_check
logout:
path: logout
target: /
remember_me:
key: "%secret%"
lifetime: 31536000
path: /
domain: ~
登录和login_path定义:
login:
pattern: /{_client}/login
defaults: { _controller: GNCApplicationBaseBundle:Security:login }
login_check:
pattern: /{_client}/login_check
我做了一个EventListener,它将在内核中被调用。请求事件:
acme.system.client.listener:
class: AcmeSystemClientBundleEventListenerClientListener
arguments: [@router, @doctrine.orm.entity_manager]
tags:
- { name: kernel.event_listener, event: kernel.request, method: onKernelRequest, priority: 10 }
重要的属性是优先级。在Symfony文档(http://symfony.com/doc/current/reference/dic_tags.html#kernel-event-listener)中可以看到,RouterListener的优先级是32,而Firewall的优先级是8。因此,我选择在防火墙之前调用我的自定义EventListener,并在路由器上下文中手动设置_client属性:
public function onKernelRequest(GetResponseEvent $event) {
$clientIdentifier = $event->getRequest()->attributes->get('_client');
$this->router->getContext()->setParameter('_client', $clientIdentifier);
}
这对我来说很有效。
我目前使用Symfony 2.2.0-RC3。