Authentication 相当于“全球”;在“U过滤器”之前;在Yesod

Authentication 相当于“全球”;在“U过滤器”之前;在Yesod,authentication,haskell,yesod,Authentication,Haskell,Yesod,我一直在尝试玩Yesod,我遇到了一个非常简单的问题,我似乎找不到解决办法 假设我想要一个全局函数,它在与路由或处理程序无关的每个请求上运行(例如身份验证函数)。说我想要像这样的东西 uid <- requireAuthId UID这样做的一种方法是为基础类型修改YESod实例。假设您的基础类型被称为APP,您可以在调用任何其他处理程序之前执行以下操作来强制授权。 instance Yesod App where --the following lines are somewhe

我一直在尝试玩Yesod,我遇到了一个非常简单的问题,我似乎找不到解决办法

假设我想要一个全局函数,它在与路由或处理程序无关的每个请求上运行(例如身份验证函数)。说我想要像这样的东西

   uid <- requireAuthId

<代码> UID

这样做的一种方法是为基础类型修改YESod实例。假设您的基础类型被称为APP,您可以在调用任何其他处理程序之前执行以下操作来强制授权。

instance Yesod App where --the following lines are somewhere within this block.
    isAuthorized (AuthR LoginR) _ = return Authorized     -- You don't want to accidentally lose access to the login page!
    isAuthorized _ _ = do
        mauth <- maybeAuth
        case mauth of
             Just _ -> return Authorized
             Nothing -> return $ Unauthorized "You must login first."
instance-Yesod-App-where--下面几行在这个块的某个地方。
isAuthorized(AuthR LoginR)\ uu=返回Authorized--您不希望意外失去对登录页面的访问权限!
isAuthorized\uuu=do
毛思返回授权
Nothing->return$Unauthorized“您必须先登录。”

显然,编辑此内容以满足您的需要,但它应该会让您了解如何执行此操作。

虽然不是您问题的答案,但Yesod中有一本关于身份验证和授权的书解释了您描述的场景。