我正在尝试编写表单提交机制,如果用户需要进行身份验证,但是一旦用户进行了身份验证,我希望自动提交表单,而无需用户再次填写值,甚至只需单击按钮。
例如,经典案例是在进行身份验证之前在博客上发布。通常,未登录的用户将完成帖子,单击“发布”,然后被重定向到身份验证页面,一旦他通过身份验证,他就不需要返回并填写帖子并再次单击“发布”。
在Play中实现此功能的正确方法是什么?
在重定向到身份验证之前,是否应该在会话中存储表单数据?
也许在身份验证页面中存储了对触发身份验证的操作的引用,以便执行第二次重定向?
答案 0 :(得分:3)
在会话中存储临时帖子不是一个好主意,会话存储在cookie中,所以它只是大小限制。很可能你需要将它存储到DB(带有一些标志,即unauthicated: true
),并且在会话存储中只存储临时帖的id,最后是一些唯一的标记。因此,在身份验证之后,您可以从会话中获取这些值并使用重定向,这允许在登录后进一步编辑和最终发布。
在这种情况下,我建议使用一些调度程序,它会在几小时/几天后清除未确认的帖子。
另一方面,允许未经身份验证/未知的用户填写Post表单并将其存储在DB中(特别是如果Post模型很大和/或允许添加文件)不是一个好主意,因为它带来了风险垃圾邮件和DoS攻击,也许在表单发送(ajax?)之前要求身份验证就更容易了。在评论系统中,如 disqus 或 livefyre 。
答案 1 :(得分:0)
我误解了你的问题! 正如biesior所说,最好是在提交表单之前强制进行身份验证。
如果你不能,不要把你的数据放在会话中,因为它的大小有限(或者只有你的数据非常小)并且签名了......实际上会话cookie并不适用于此! 因此,您必须将您的发布数据提交到服务器,使用自定义ID将它们存储在缓存(或数据库中,如biesior所说)中,并在查询(或会话cookie)中将此ID重定向到身份验证器,并将其重定向回您的在服务器上,您可以从ID中重新找到数据并完成POST。