我刚开始学习Symfony 2教程。我已经创建了一个包含用户类的包,并尝试按照说明设置登录过程。我想我差不多了,不过我现在正处于最后一关。
我已经设置了一个包:Dan \ AuthBundle,它包含我的用户类和另一个包:Dan \ HelloBundle,我想只允许登录用户访问。
我的security.yml文件如下:
security:
encoders:
Dan\AuthBundle\Entity\User: sha512
providers:
main:
entity: { class: Dan\AuthBundle\Entity\User, property: username }
administrators:
entity: { class: DanAuthBundle:User }
firewalls:
secured_area:
pattern: ^/*
form_login:
check_path: /login_check
login_path: /login
always_use_default_target_path: false
default_target_path: /hello
access_control:
- { path: ^/hello/.* }
主要的routing.yml文件如下所示:
DanAuthBundle:
resource: "@DanAuthBundle/Resources/config/routing.yml"
prefix: /auth/
DanHelloBundle_homepage:
pattern: /hello/
defaults: { _controller: DanHelloBundle:Default:index }
login:
pattern: /login
defaults: {_controller: DanAuthBundle:Default:login }
login_check:
pattern: /login_check
我手动创建了几个用户类实例。
如果我尝试访问url / hello,我会正确地重定向到登录页面。如果我输入了错误的详细信息,我会在模板中收到正确的消息,但是,当我使用正确的详细信息登录时,我收到324(空响应)错误(此时,浏览器中显示的URL是login_check)。
从阅读文档,我想我应该被重定向到我最初尝试访问的页面?
http://symfony.com/doc/current/book/security.html#using-a-traditional-login-form
默认情况下,如果提交的凭据正确,则用户将是 重定向到请求的原始页面(例如/ admin / foo)。 如果用户最初直接进入登录页面,他就会 重定向到主页。这可以高度定制,允许 例如,您可以将用户重定向到特定的URL。
此外,如果我在输入正确的详细信息后尝试访问该页面,我将再次被重定向到登录页面。
有人能看出我是否遗漏了任何明显的东西?
这是我的日志文件:
[2012-06-18 18:33:47] doctrine.DEBUG:SELECT t0.id AS id1,t0.username AS username2,t0.salt AS salt3,t0.hashed_password AS hashed_password4 来自用户t0 WHERE t0.username =? ([“你好”])[] [] [2012-06-18 18:33:47] security.INFO:用户“你好”已经过身份验证 成功[] [] [2012-06-18 18:33:47] event.DEBUG:听众 “Symfony \ Component \ Security \ Http \ Firewall :: onKernelRequest”已停止 传播事件“kernel.request”。 [] [] [2012-06-18 18:33:47] event.DEBUG:听众 “Symfony \ Bundle \ FrameworkBundle \ EventListener \ RouterListener”不是 调用事件“kernel.request”。 [] [] [2012-06-18 18:33:47] event.DEBUG:听众 “Symfony \ Bundle \ AsseticBundle \ EventListener \ RequestListener”不是 调用事件“kernel.request”。 [] [] [2012-06-18 18:33:47] event.DEBUG:监听器的通知事件“kernel.response” “的Symfony \分量\安全\ HTTP \防火墙\ ContextListener :: onKernelResponse”。 [] [] [2012-06-18 18:33:47] security.DEBUG:写入SecurityContext 会话[] []
任何建议表示赞赏。
感谢。
答案 0 :(得分:7)
// if you're using Symfony 2.0
$key = '_security.target_path';
// if you're using Symfony 2.1 or greater
// where "main" is the name of your firewall in security.yml
$key = '_security.main.target_path';
// try to redirect to the last page, or fallback to the homepage
if ($this->container->get('session')->has($key)) {
$url = $this->container->get('session')->get($key);
$this->container->get('session')->remove($key);
} else {
$url = $this->container->get('router')->generate('homepage');
}
return new RedirectResponse($url);
答案 1 :(得分:4)
你需要2个听众。
在会话最后一页设置
成功登录后第二次重定向
该链接将解决您的问题:http://www.reecefowell.com/2011/10/26/redirecting-on-loginlogout-in-symfony2-using-loginhandlers/
答案 2 :(得分:-3)
只需使用getUser检查您的相应操作(您在哪里呈现登录表单视图),如下所示:
if($this->getUser()){
return $this->redirect($this->generateUrl('your-redirect-path-alise'));
}