【问题标题】:simple form symfony2 firewall redirection简单形式 symfony2 防火墙重定向
【发布时间】:2014-04-30 14:04:43
【问题描述】:

这是我的问题。

情况

我正在尝试在用户登录期间添加一些自定义逻辑。我可以找到这样做的方法: 艰难的方式(但有很多控制);按照this guidelines of the cookbookthis complementing publication of vandenbrand 构建我自己的身份验证提供程序

简单的方法(正是我需要的):使用 simple_form。 simple_form 是一个与 form_login 具有相同选项的密钥,但我可以为其定义一个“身份验证器”。 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)。

但是,一旦输入了正确的凭据(并且显然经过验证),我就会一直停留在同一页面上。它不会重定向到我最初要求的页面 /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 对象,明文密码,身份验证器密钥:UsernamePasswordToken($username, $password, $providerKey)

6) 令牌被传递到身份验证器对象的 authenticateToken 方法 de 上。此方法将通过 $token->getCredentials()) 访问的令牌中包含的明文密码哈希与数据库中的哈希密码进行比较。

7) 验证成功:我们被重定向到 /foo/user/secured/target 。令牌和用户在会话中被序列化(问题从这里开始:确实,用户清除密码已被删除,因此它不会在会话中留下痕迹,getCredentials() 现在将返回空字符串)。)。 p>

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

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

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

停止编辑 1。

解决方案

有谁知道为什么 'form_login' 和 'simple_form' 之间的行为会发生这种变化?最重要的是,您知道解决此问题的好方法吗?我想身份验证方法或自定义身份验证器应该稍微改变一下,但我对安全性还没有足够的信心优雅地解决这个问题。

非常感谢。

亲切的问候,

智者

【问题讨论】:

    标签: security symfony authentication firewall


    【解决方案1】:

    您必须使用示例中的一些字符串(不是对象)。或者为 User 实体实现 __toString()。

    不是 return new UsernamePasswordToken($user, ...

    使用 return new UsernamePasswordToken($user->getEmail() 或其他,...

    【讨论】:

      【解决方案2】:

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

      登录后重定向:

      • always_use_default_target_path(类型:布尔值,默认值:false)
      • default_target_path(类型:字符串,默认值:/)
      • target_path_parameter(类型:字符串,默认值:_target_path)
      • use_referer(类型:布尔值,默认值:false)

      您可以看到“SecurityBundle Configuration ("security")”一书的部分 http://symfony.com/doc/current/reference/configuration/security.html

      希望对你有用。

      亲切的问候。

      【讨论】:

      • 嗨艾拉姆。感谢您的反馈。但是,我确实知道这些选项,但它们对我的问题没有影响。使用默认选项集,我们通常会被重定向到首先询问的页面。但是,我们目前不是。即使我将 'default_target_path' 设置为 /foo/user/secured/target ,我仍然卡在登录页面(!)
      • 在日志中:[2014-04-30 17:27:59] event.DEBUG: Notified event "kernel.exception" to listener "Symfony\Component\Security\Http\Firewall\ExceptionListener::onKernelException". [] [] [2014-04-30 17:27:59] security.INFO: Authentication exception occurred; redirecting to authentication entry point (Invalid username or password) [] []。奇怪的是,此通知发生在重新加载时,在用户成功通过身份验证后:[2014-04-30 17:17:30] security.INFO: User "13987806178942" has been authenticated successfully [] []
      • 这似乎与自定义身份验证器的 authenticateToken 方法中调用的方法 $token->getCredentials() 相关联。基本上,在登录期间,getCredentials() 以明文形式返回密码,该密码被提供给编码器,编码器返回 true(在 db 中找到)。但是,在那之后,我猜在重定向到 /foo/user/secured/target 期间,authenticToken 会再次被调用。那个时候,$token->getCredentials()返回空字符串,导致encoder返回false...
      • 对不起,我不知道为什么会这样。
      • 我用逐步确定的过程编辑了我的初始问题。这是否有助于识别和解决问题?
      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-07-08
        • 1970-01-01
        • 1970-01-01
        • 2014-11-18
        • 2012-03-26
        • 2016-01-21
        • 1970-01-01
        相关资源
        最近更新 更多