我的登录流程类似于此问题Yesod auth: redirecting user to registration page
中描述的登录流程用户使用其中一种方法(Persona,Facebook,Google +)登录后,他会被重定向到要求他填写有关其个人资料(姓名,电子邮件等)的基本信息的页面,应用尝试从登录提供程序中获取尽可能多的信息,并为用户预填充配置文件字段。用户提交个人资料表单后,他会被重定向回到他来自的页面(这很重要,我不想像上面链接的问题那样将它们重定向回HomeR。)
现在关于实施。我的模型基本上看起来像这样:
User
ident Text
profile Profile Maybe
UniqueUser ident
deriving Typeable Show
Profile
name Text
email Text
deriving Typeable Show
对于非现有用户,我在Nothing
中创建了getAuthId
个人资料。在onLogin
之后,我检查用户是否有个人资料,如果没有,则将其重定向到CreateProfileR
。在CreateProfileR
中,我呈现表单,接收输入,然后使用redirectUltDest
,以便用户返回到它来自的位置。
一切都很好,但有一个问题。如果用户行为不端并离开CreateProfileR
而没有填写他的个人资料,我最终会遇到登录用户,他们没有提供重要信息。这不好。
所以我想要的是将用户重定向到CreateProfileR
,只要它不提交他的个人资料。
由于我不想在我的所有处理程序中处理它,我试图在maybeAuthId
中执行它。但是如果我这样做,用户就会卡在CreateProfileR
上(我想我可以通过从请求中提取路由并使CreateProfileR
成为一条不会重定向到自身的特殊路由来避免它,但这似乎不是一个很好的解决方案)。
似乎maybeAuthId
不是正确的地方,但我无法找到解决问题的好方法。您认为正确的方式是什么?