使用身份验证与自定义阅读器Monad与Servant

时间:2016-05-14 16:23:17

标签: haskell servant

使用基本身份验证保护的API

type SubApi = API1 :<|> API2 :<|> API3
type API = BasicAuth "foo-realm" AuthData :> SubApi

支持AuthData -> Handler a类型的处理程序。

我有一套处理程序:

handler1 :: Request1 -> AuthMonad Response
handler2 :: Request2 -> AuthMonad Response

在AuthMonad中运行,这是一个ReaderT,其上下文部分来自AuthData。 使用enterAuthMonad :~> Handler,我可以获得Server API类型AuthData -> AuthMonad的支持处理程序,但我真正想做的是使用AuthData参数作为runReaderT的环境。

我不太了解enter正在进行的类型向导,以了解如何执行此操作。有任何想法吗?

1 个答案:

答案 0 :(得分:0)

刚刚意识到我把这个挂了。

大多数情况下,只是过度思考这一点 - 答案非常明显。 在上面的例子中,我创建了一个可以创建自然变换的函数:

enterAuth :: AuthData -> AuthMonad :~> Handler

我在构建ServerT时使用了它:

protectedServer :: AuthData -> ServerT ProtectedAPI Handler
protectedServer ad = enter (enterAuth ad) protectedServer'

,其中

genAuthServerContext :: Context (AuthHandler Request AuthData ': '[])