当用户不在YesSOD/Haskell中的数据库中时,如何重定向到特殊页面

当用户不在YesSOD/Haskell中的数据库中时,如何重定向到特殊页面,haskell,redirect,authorization,yesod,Haskell,Redirect,Authorization,Yesod,所以,我真的很喜欢Yesod认证选项,因为这意味着我不必安全地存储密码和散列等 我想知道的是,我如何检测是否有人是第一次登录,然后将他们重定向到“创建帐户”页面,以便他们可以将他们的凭据链接到我的web应用的帐户(用户名、配置文件图片等) 现在,很容易检测到用户是否在我的数据库中。给我带来麻烦的部分是弄清楚如何进行重定向。理想情况下,我想要这样的流 user tries to access page FOO requiring login if they are logged in th

所以,我真的很喜欢Yesod认证选项,因为这意味着我不必安全地存储密码和散列等

我想知道的是,我如何检测是否有人是第一次登录,然后将他们重定向到“创建帐户”页面,以便他们可以将他们的凭据链接到我的web应用的帐户(用户名、配置文件图片等)

现在,很容易检测到用户是否在我的数据库中。给我带来麻烦的部分是弄清楚如何进行重定向。理想情况下,我想要这样的流

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
的页面,则不会发生这种情况

我可以在他们每次进入require页面时进行检查,但这会导致大量代码重用,而且看起来很难看,而且是非模块化的

另一个可能的解决方案是在getAuthId期间重定向,但我不知道如何做,因为它具有类型
处理程序凭据
,而不是
Html


我愿意接受关于什么是可能的,什么是最佳实践的建议。

我不能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
getMyLoginR::Handler Html
getMyLoginR=do

ur这不是
授权的目的吗?您可以在“授权”下查看中的示例。有关部分是,

-- 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\uu
并在那里运行函数。

不,这不太正确。我知道如何编写这样的重定向页面。我的问题是,每当用户转到需要登录的页面时,即当处理程序调用
requireAuth
时,我希望用户重定向到此页面。如果用户转到getMyLoginR,这非常有效,但是如果用户转到另一个需要身份验证的页面,这将不起作用。我想知道如何让所有身份验证都通过这样的检查,这样,如果用户是新用户,在未经检查和重定向的情况下就无法登录。您可以使用
maybeAuth
(不会自动重定向)在
requireAuth
周围编写一个包装器然后,您可以在任何地方使用该包装器,而不是requireAuth。顺便说一句,在上面的示例中,getMyLoginR是登录目的地,因此您可以跟踪那里的新用户。当然,如果有人登录后决定跳过该页面,但手动输入另一个url,则不会进行该检查。如果这是你需要的检查级别,你必须像我上面提到的那样创建自己的包装:这也是我的计划,但你现在可以超越Maybauth了。您可以将重定向放入其中,并让requireAuth处理重定向到登录页面的情况。