【问题标题】:Get user from database using session value (Haskell - Yesod)使用会话值从数据库中获取用户(Haskell - Yesod)
【发布时间】:2016-10-06 16:53:29
【问题描述】:

我想使用会话值而不是 Key 从数据库中获取用户信息。

使用这个:

    getProfileR :: Handler Html
    getProfileR = do
    user <- runDB $ get404 $ lookupSession "_ID"
    defaultLayout $ do
        $(whamletFile "templates/profile.hamlet")

改为:

    getProfileR :: UserId -> Handler Html
    getProfileR uid = do
    user <- runDB $ get404 uid
    defaultLayout $ do
        $(whamletFile "templates/profile.hamlet")

有可能吗?不推荐吗?

【问题讨论】:

  • 你为什么要这样做?如果我没记错的话,Yesod 已经做了那些簿记工作。它将AuthID 存储在您的会话中,这通常是持久键。
  • 我可以将 AuthID 作为 Key 用于另一个使用 UserID 作为外键的表吗?如果可能的话,我相信这可以解决我的问题。
  • 是的。但那是在数据库模式级别本身。所以你几乎可以做任何你想做的事。如果您能说出您要解决的问题,我们可能会为您提供更好的帮助。
  • 我想从数据库中获取与用户相关的信息。因此,我必须检索登录的 UserId 才能在另一个表中查找数据。它不一定是 Session 值。
  • 你正在寻找这样的东西:s3.amazonaws.com/haddock.stackage.org/lts-6.2/…。我建议你通读这一章:yesodweb.com/book/authentication-and-authorization

标签: session haskell authentication yesod


【解决方案1】:

lookupSession的类型是:

lookupSession :: MonadHandler m => Text -> m (Maybe Text)

所以我会尝试这样的事情:

    getProfileR :: Handler Html
    getProfileR = do
      uid <- lookupSession "_ID"
      user <- runDB $ get404 (Just uid)
      defaultLayout $ do
        $(whamletFile "templates/profile.hamlet")  

【讨论】:

  • 我收到以下错误:/home/ubuntu/workspace/tpayesod/src/Handlers.hs:235:30: Couldn't match expected type ‘Key t0’ with actual type ‘Maybe Text’ In the first argument of ‘get404’, namely ‘uid’ In the second argument of ‘($)’, namely ‘get404 uid’
  • 好吧 - 它不会工作。您必须将uid 转换为文本。目前uidKey ...。如果您能以某种方式将其转换为 Text 值,它将起作用。
猜你喜欢
  • 1970-01-01
  • 2018-01-23
  • 1970-01-01
  • 2017-12-27
  • 2013-08-24
  • 2016-07-10
  • 1970-01-01
  • 2016-07-03
  • 2016-06-15
相关资源
最近更新 更多