当用户不在 Yesod/Haskell 的数据库中时如何重定向到特殊页面
Posted
技术标签:
【中文标题】当用户不在 Yesod/Haskell 的数据库中时如何重定向到特殊页面【英文标题】:How to redirect to special page when user is not in database in Yesod/Haskell 【发布时间】:2014-01-15 15:21:14 【问题描述】:所以,我真的很喜欢 Yesod 身份验证选项,因为这意味着我不必管理安全地存储密码和哈希等。
我想知道的是,我如何检测某人是否是第一次登录,然后将他们重定向到“创建帐户”页面,以便他们可以将他们的凭据链接到我的网络应用程序的帐户(用户名、头像等)
现在,很容易检测用户是否在我的数据库中。给我带来麻烦的部分是弄清楚如何进行重定向。理想情况下,我想要这样的流程
user tries to access page FOO requiring login
if they are logged in
they go to FOO
if they are not logged in
they log in with credentials
if the credentials are in the database
they go to FOO
if the credentials are not in the database
they get redirected to CreateProfile
when the submit CreateProfile, they are redirected to FOO
现在,我已将loginDest
设置为将他们重定向到“检查是否在数据库中”页面,然后该页面要么重定向到主页,要么提示他们创建配置文件。问题在于,只有在他们转到AuthR LoginR
时才会进行检查。如果他们转到使用 requireAuth
的页面,则不会发生这种情况。
我可以在他们每次访问所需页面时进行检查,但这会导致大量代码重用,而且看起来很丑陋且不模块化。
另一个可能的解决方案是在 getAuthId 期间重定向,但我不知道该怎么做,因为它的类型为 Handler credentials
,而不是 html
。
我愿意接受有关什么是可能的以及最佳做法是什么的建议。
【问题讨论】:
【参考方案1】:这不是isAuthorized
的用途吗?您可以在“授权”下的the yesod cook book 中查看示例。相关部分是,
-- route name, then a boolean indicating if it's a write request
isAuthorized HomeR True = isAdmin
isAuthorized AdminR _ = isAdmin
-- anyone can access other pages
isAuthorized _ _ = return Authorized
您只需检查他们是否已登录,而不是 isAdmin
函数,如果未登录,则通过返回 AuthenticationRequired
将他们重定向到登录页面。
编辑:您提到了有关检查他们是否是“新”用户的内容。您应该能够在检查他们是否已登录的函数中执行此操作。如果您想为所有页面捕获此信息,您可以使用 isAuthorized _ _
并在那里运行该函数。
【讨论】:
【参考方案2】:我不是 100% 确定我已经关注了您的问题,因为您的第一段只是要求检测新用户,但后来您询问了 requireAuth
,您可能对所有用户都这样做,而不仅仅是新用户。无论如何,假设它只是针对新用户,我会这样做:
getMyLoginR :: Handler Html
getMyLoginR = do
ur <- getUserRecord -- this is your check in the DB function
-- (you will have to write it)
if (isNothing ur)
then do
setMessage "Please set your preference"
redirect PrefHandlerR -- this is where you put your form asking for details
else do
redirect OtherHandlerR
【讨论】:
不,这不太对。我知道如何编写这样的重定向页面。我的问题是,我希望用户在访问需要登录的页面时被重定向到此页面,即当处理程序调用requireAuth
时。如果用户转到 getMyLoginR,这很有效,但如果他们转到另一个需要身份验证的页面,它就不起作用。我想知道如何使所有身份验证都通过这样的检查,因此如果用户是新用户,则无法在未经检查的情况下登录,如果是,则重定向。
您可以使用maybeAuth
围绕requireAuth
编写一个包装器(不会自动重定向),然后您可以在任何地方使用该包装器而不是requireAuth。顺便说一句,在上面的示例中,getMyLoginR 是登录目的地,因此您可以在那里跟踪新用户。当然,如果有人登录然后决定跳过该页面但手动输入另一个 url,则不会进行该检查。如果这是您需要的检查级别,则必须像我上面提到的那样创建自己的包装器
Ecognium:这也是我的计划,但你现在可以覆盖 MaybeAuth。您可以将重定向放入其中,并让 requireAuth 处理重定向到登录页面的情况。以上是关于当用户不在 Yesod/Haskell 的数据库中时如何重定向到特殊页面的主要内容,如果未能解决你的问题,请参考以下文章
当活动不在前面时,在Android中暂停CountDownTimer
当 UserID = 1 且 CourseID 不在数组中时删除?
当应用不在前台时,Ionic / Cordova 触发应用操作
当 ScrollView 不在顶部时禁用 SwipeRefreshLayout