Security 简单表单symfony2防火墙重定向

Security 简单表单symfony2防火墙重定向,security,symfony,authentication,firewall,Security,Symfony,Authentication,Firewall,这是我的问题 情况: 我试图在用户登录期间添加一些自定义逻辑。我可以找到这样做的方法: 艰难的道路(但有很多控制);构建自己的身份验证提供程序,遵循或 简易方法(正是我需要的):使用简单的表格。simple_form是一个与form_login具有相同选项的键,但我可以为其定义一个“验证器”。 问题 我有一个现有的和可操作的app/security.yml配置,带有“form_login”键 secured_area: pattern: ^/foo/user/secure

这是我的问题

情况

我试图在用户登录期间添加一些自定义逻辑。我可以找到这样做的方法: 艰难的道路(但有很多控制);构建自己的身份验证提供程序,遵循或

简易方法(正是我需要的):使用简单的表格。simple_form是一个与form_login具有相同选项的键,但我可以为其定义一个“验证器”。

问题

我有一个现有的和可操作的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
我遵循了上述教程的步骤。因此,my 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,您至少需要使用要访问的角色_user来标识该用户

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

3) 它重定向到登录路径

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

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

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

7) 身份验证成功:我们被重定向到/foo/user/secured/target。令牌和用户在会话中被序列化(问题从这里开始:事实上,用户清除密码被擦除,这样它就不会在会话中留下轨迹,getCredentials()现在将返回空字符串

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

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

10) 引发的异常会触发防火墙重定向到登录页面。我们就是这样:陷入无限循环,系统地登陆登录页面

停止编辑1

解决方案

有人知道为什么“表单登录”和“简单表单”之间会出现这种行为变化吗?最重要的是,你知道解决这个问题的好方法吗?我想应该稍微更改一下身份验证方法或自定义身份验证程序,但我对安全性还没有足够的信心来优雅地解决这个问题

非常感谢

亲切问候,


Wisebes

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

登录后重定向:

  • 始终使用默认目标路径(类型:布尔,默认值:false)
  • 默认\u目标\u路径(类型:字符串,默认值:/)
  • 目标路径参数(类型:字符串,默认值:\目标路径)
  • 使用\u referer(类型:Boolean,默认值:false)
您可以看到“SecurityBundle配置(“安全”)一书中的部分

我希望这对你有用


亲切问候。

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


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

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

不是 返回新的UsernamePasswordToken($user

使用
返回新的UsernamePasswordToken($user->getEmail()或者随便什么,

Hi-Airam。谢谢你的反馈。不过,我知道这些选项,但它们对我的问题没有影响。使用默认选项集,我们通常会被重定向到一开始询问的页面。但是,我们目前没有。即使我将“default\u target\u path”设置为/foo/user/secured/target,我仍然停留在登录页面上(!)在日志中:
[2014-04-30 17:27:59]event.DEBUG:向侦听器“Symfony\Component\Security\Http\Firewall\ExceptionListener::onKernelException”通知事件“kernel.exception”。[][[2014-04-30 17:27:59]Security.INFO:发生身份验证异常;重定向到身份验证入口点(无效用户名或密码)[][]
。奇怪的是,此通知发生在用户成功身份验证后的重新加载时:
[2014-04-30 17:17:30]security.INFO:user“13987806178942”已成功身份验证[][]
这似乎链接到方法$token->getCredentials()在自定义验证器的authenticateToken方法中调用。基本上,在登录过程中,getCredentials()以明文形式返回密码,该密码被提供给编码器,编码器返回true(在db中找到)。但是,在这之后,我猜在重定向到/foo/user/secured/target的过程中,authenticateToken会被调用
secured_area:
pattern:    ^/foo/user/secured/