这是我的问题。
场合:
我正在尝试在用户登录期间添加一些自定义逻辑。我可以找到方法: 艰难的方式(但有很多控制);按照this guidelines of the cookbook或this 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
答案 0 :(得分:1)
您必须使用样本中的某些字符串(而不是对象)。或者为User实体实现__toString()。
不会强> 返回新的UsernamePasswordToken($ user,...
使用强> 返回新的UsernamePasswordToken($ user-> getEmail()或其他,...
答案 1 :(得分:0)
如果您想访问您请求的页面,可以使用Symfony为您提供的任何选项:
登录后重定向:
您可以看到本书的一部分' SecurityBundle配置("安全")' http://symfony.com/doc/current/reference/configuration/security.html
我希望这对你有用。
亲切的问候。
答案 2 :(得分:0)
好吧,因为我无法使其正常工作,我创建了自己的自定义身份验证提供程序。我希望上面报告的问题尽快得到解决。如果有人得到答案,我仍然感兴趣!
对于面临同样问题的其他人,我建议您创建自定义身份验证提供程序。您甚至可以从现有的身份验证提供程序继承,因此限制要进行的修改。总而言之,您可以通过这种方式添加自定义逻辑,但有一定的麻烦。