使用 Haskell 向现有 Yesod 项目添加身份验证

Adding Authentication to existing Yesod project with Haskell

我一直在使用 this guide 来为我的项目添加身份验证和授权。我是 Yesod 的新手,运行遇到了一些问题:

我正在使用以下基础数据:

data App = App (TChan Text)

为了我的身份验证,我需要这种数据类型:

data App = App SqlBackend

如何将两者结合起来?然后我还必须更改现有功能吗?

最后我运行一切都是这样的:

main :: IO ()
main = runNoLoggingT $ withSqliteConn "email.db3" $ \conn -> liftIO $ do
    runSqlConn (runMigration migrateAll) conn
    chan <- newTChanIO
    warp 3000 $ App chan
-- Backend SqlBackend needs to be initilized with conn (see below)


{- OLD
main = do
    chan <- newTChanIO
    warp 3000 $ App chan
-}

{- NEW
main = runNoLoggingT $ withSqliteConn "email.db3" $ \conn -> liftIO $ do
    runSqlConn (runMigration migrateAll) conn
    warp 3000 $ App conn
-}

我知道我必须将两者结合起来。我读 this article。我如何将 chanconn 放在一起?这听起来可能微不足道,但那里的文档很少。

请帮帮我!

通常人们将他们的 App 数据类型设置为具有多个字段的记录。例如,scaffolded Yesod project 使用此代码:

data App = App
    { appSettings    :: AppSettings
    , appStatic      :: Static -- ^ Settings for static file serving.
    , appConnPool    :: ConnectionPool -- ^ Database connection pool.
    , appHttpManager :: Manager
    , appLogger      :: Logger
    }

您链接到的 example code 也是这样做的:

data App = App
    { homepageContent :: Html
    , visitorCount    :: IORef Int
    }

那么像这样的事情呢:

-- Small caveat: this is code untested
data App = App
        { backend :: SqlBackend
        , chan    :: TChan Text
        }

main :: IO ()
main = do
    chan <- newTChanIO
    runNoLoggingT $ withSqliteConn "email.db3" $ \conn -> liftIO $ do
        runSqlConn (runMigration migrateAll) conn
        warp 3000 $ App { backend=conn, chan=chan}

您必须更改访问您的 TChan 的旧代码,但是一旦您的应用成为记录,您就可以添加更多字段而无需更改代码库的其余部分。

附带说明一下,您是否考虑过使用 Yesod scaffolding?您将从为您处理所有这一切开始,并为您实施一系列其他细节和最佳实践。