Haskell 如何从Wai请求转到Yesod路线?

Haskell 如何从Wai请求转到Yesod路线?,haskell,basic-authentication,yesod,haskell-wai,Haskell,Basic Authentication,Yesod,Haskell Wai,我想使用来隐藏HTTP基本身份验证后面的一些页面。为此,HttpAuth中间件提供了authIsProtected::!(请求->IO布尔) 要实现authIsProtected我需要检查URL是否仅为admin;最好的方法似乎是在路由文件中创建路由,然后使用以下函数访问它们:routeAttrs::routeAttrs a=>Route a->Set Text 但是,我没有访问authIsProtected功能中的路由,只有Wai请求。我有没有办法从Wai请求到路线?我想是的,我必须在引擎盖下

我想使用来隐藏HTTP基本身份验证后面的一些页面。为此,HttpAuth中间件提供了
authIsProtected::!(请求->IO布尔)

要实现
authIsProtected
我需要检查URL是否仅为admin;最好的方法似乎是在
路由
文件中创建路由,然后使用以下函数访问它们:
routeAttrs::routeAttrs a=>Route a->Set Text

但是,我没有访问
authIsProtected
功能中的
路由
,只有Wai
请求
。我有没有办法从Wai
请求
路线
?我想是的,我必须在引擎盖下做这件事,但我不知道在哪里/如何做

我可能应该在
isAuthorized
中执行身份验证,在那里我可以访问
路由
,但我不确定我是否可以从那里运行HTTP基本身份验证

makeApplication :: AppConfig DefaultEnv Extra -> IO Application
makeApplication conf = do
    foundation <- makeFoundation conf

    app <- toWaiAppPlain foundation
    return $ basicAuth 
                (\u p -> return $ u == "username" && p == "password") 
                ("My Realm" { authIsProtected = \waiRequest -> do 
                    -- Would like to access a route / route attrs here
                    return True } :: AuthSettings) 
                $ app
makeApplication::AppConfig DefaultEnv Extra->IO应用程序
makeApplication conf=do
基金会
--要在此处访问路由/路由属性吗
返回True}::AuthSettings)
$app
编辑:以下是我的想法:

import Network.Wai (queryString, pathInfo, Request)
import Network.HTTP.Types.URI (queryToQueryText)
import Control.Arrow (second)
import Data.Maybe (fromMaybe)
import Yesod (Route)
import Data.Set (member)

makeApplication :: AppConfig DefaultEnv Extra -> IO Application
makeApplication conf = do
    foundation <- makeFoundation conf

    -- Create the WAI application and apply middlewares
    app <- toWaiAppPlain foundation
    return $ basicAuth 
                (\u p -> return $ u == "username" && p == "password") 
                ("My Realm" { authIsProtected = \waiReq -> do 
                    let mRoute = parseRoute(pathInfo waiReq,textQueryString waiReq) :: Maybe (Route App)
                    return $ maybe False adminOnly mRoute
                    } :: AuthSettings) 
                $ app

adminOnly :: Route App -> Bool
adminOnly r = "admin" `member` routeAttrs r

-- Copied from Yesod.Core.Internal.Request
textQueryString :: Request -> [(Text, Text)]
textQueryString = map (second $ fromMaybe "") . queryToQueryText . queryString
import Network.Wai(查询字符串、路径信息、请求)
导入Network.HTTP.Types.URI(queryToQueryText)
导入控制。箭头(第二个)
导入数据。可能(来自可能)
进口(路线)
导入数据集(成员)
makeApplication::AppConfig DefaultEnv Extra->IO应用程序
makeApplication conf=do
基金会
让mRoute=parseRoute(路径信息waiReq,文本查询字符串waiReq)::可能(路由应用)
返回$False adminOnly mRoute
}::AuthSettings)
$app
adminOnly::路由应用程序->Bool
adminOnly r=“admin”`member`routeAttrs r
--从Yesod.Core.Internal.Request复制
textQueryString::请求->[(文本,文本)]
textQueryString=map(第二个$fromMaybe”“)。queryToQueryText。质询

是否提供了您想要的?你只需要与和合作。

是的,这就是我需要的!我找到了
parseRoute
,但无法确定它要接受哪些参数。我用我提出的代码编辑了我的问题,看起来效果不错。