繁体   English   中英

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

[英]Adding Authentication to existing Yesod project with Haskell

我一直在使用本指南 ,以便为我的项目添加身份验证和授权。 我是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
-}

我知道我必须将两者结合起来。 我读了这篇文章 我如何获得chanconn在一起? 听起来似乎很琐碎,但是那里几乎没有文档。

请帮我!

通常,人们将其App数据类型记录为具有多个字段的记录。 例如, 脚手架的Yesod项目使用以下代码:

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

您链接到的示例代码也可以做到这一点:

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脚手架 您将首先为您处理所有这些工作,并为您实现许多其他优点和最佳实践。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM