简单形式symfony2防火墙重定向

时间:2014-04-30 14:04:43

标签: security symfony authentication firewall

这是我的问题。

场合

我正在尝试在用户登录期间添加一些自定义逻辑。我可以找到方法: 艰难的方式(但有很多控制);按照this guidelines of the cookbookthis complementing publication of vandenbrand

构建自己的身份验证提供程序

简单方法(正是我需要的):使用simple_form。 simple_form是一个与form_login具有相同选项的键,但我可以为其定义一个" authenticator"。 cookbook tuto I used can be found here

问题

我有一个现有的,可操作的app / security.yml配置' form_login'键。

secured_area:
        pattern:    ^/foo/user/secured/
        form_login:
            check_path: /foo/user/secured/login_check
            login_path: /foo/user/login

我按照上述教程的步骤进行操作。因此,我的security.yml被修改为:

        secured_area:
        pattern:    ^/foo/user/secured/
        #form_login:
        simple_form:
            authenticator: foo_authenticator
            check_path: /foo/user/secured/login_check
            login_path: /foo/user/login

当我尝试访问安全区域的页面/ foo / user / secured / target时,防火墙完成其工作:它捕获查询并请求凭据(通过中间页面/ foo / user / login)。 / p>

但是,一旦输入正确的凭据(并且明显经过验证),我会一直停留在同一页面上。它没有重定向到我首先要求的页面/ foo / user / secured / target。尝试通过新请求访问该页面没有令人耳目一新的事情:我仍然处于登录阶段。

编辑1:以下是我根据日志和调试确定的步骤:

1)用户尝试访问/ foo / user / secured / target,至少需要使用ROLE_USER进行识别才能访问

2)防火墙拦截此请求,因为它匹配侦听的路由(app / config / security.yml):

secured_area:
pattern:    ^/foo/user/secured/

3)它重定向到登录路线

4)用户填写用户名和密码,并提交帖子

5)收到表单时,将通过自定义验证程序的createToken方法创建令牌。它返回一个UsernamePasswordToken类的对象,该对象使用参数username,密码为clear,authenticater key创建:UsernamePasswordToken($ username,$ password,$ providerKey)

6)令牌被传递给authenticater对象的authenticateToken方法de。此方法将令牌中包含的清除密码哈希值和通过$ token-> getCredentials()访问的清除密码哈希与数据库中的哈希密码进行比较。

7)身份验证工作:我们被重定向到/ foo / user / secured / target。令牌和用户在会话中被序列化( ISSUE STARTS HERE:确实,用户清除密码被删除,因此它不会在会话中留下曲目,而getCredentials()将返回空字符串)。

8)在加载页面时,激活防火墙。它检测用户登录,似乎想检查其令牌。因此,它调用authenticateToken。

9)authenticateToken尝试将sha1($ token-> getCredentials())与数据库中的哈希密码进行比较。 comme $ token-> getCredentials()为空,比较失败。 authenticateToken引发异常。

10)引发异常会触发防火墙重定向到登录页面。我们在:登录页面系统地卡在无限循环着陆中。

停止编辑1。

解决方案

有谁知道为什么这种行为改变了' form_login'和' simple_form'?最重要的是,你知道解决这个问题的好方法吗?我认为身份验证方法或自定义身份验证器应该略有改变,但我对安全性的信心不足以优雅地解决这个问题。

非常感谢提前。

亲切的问候,

Wisebes

3 个答案:

答案 0 :(得分:1)

您必须使用样本中的某些字符串(而不是对象)。或者为User实体实现__toString()。

不会 返回新的UsernamePasswordToken($ user,...

使用 返回新的UsernamePasswordToken($ user-> getEmail()或其他,...

答案 1 :(得分:0)

如果您想访问您请求的页面,可以使用Symfony为您提供的任何选项:

登录后重定向:

  • always_use_default_target_path(type:Boolean,default:false)
  • default_target_path(type:string,default:/)
  • target_path_parameter(type:string,default:_target_path)
  • use_referer(type:Boolean,default:false)

您可以看到本书的一部分' SecurityBundle配置("安全")' http://symfony.com/doc/current/reference/configuration/security.html

我希望这对你有用。

亲切的问候。

答案 2 :(得分:0)

好吧,因为我无法使其正常工作,我创建了自己的自定义身份验证提供程序。我希望上面报告的问题尽快得到解决。如果有人得到答案,我仍然感兴趣!

对于面临同样问题的其他人,我建议您创建自定义身份验证提供程序。您甚至可以从现有的身份验证提供程序继承,因此限制要进行的修改。总而言之,您可以通过这种方式添加自定义逻辑,但有一定的麻烦。