[英]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
-}
我知道我必须将两者结合起来。 我读了这篇文章 。 我如何获得chan
和conn
在一起? 听起来似乎很琐碎,但是那里几乎没有文档。
请帮我!
通常,人们将其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.