Wai HttpAuth Middleware을 사용하여 HTTP 기본 인증 뒤에 몇 페이지를 숨기고 싶습니다. 이를 위해 HttpAuth 미들웨어는 authIsProtected :: !(Request -> IO Bool)
을 제공합니다.Wai 요청에서 Yesod Route로 어떻게 갈 수 있습니까?
authIsProtected
을 구현하려면 URL이 관리자 전용인지 확인해야합니다. 가장 좋은 방법은 routes
파일에 route attributes을 작성한 다음이 함수를 사용하여 액세스하는 것입니다 : routeAttrs :: RouteAttrs a => Route a -> Set Text
.
그러나 authIsProtected
함수의 Route
에 액세스 할 수 없습니다. 단지 Request
입니다. Wai Request
에서 Route
으로 갈 수있는 방법이 있습니까? 나는 Yesod가 이것을 후드에서해야한다고 생각한다. 그러나 나는 어디에서 어떻게 알 수 없다.
가능하면 isAuthorized
에 인증을해야하는데, Route
에 액세스 할 수 있지만 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
편집 :
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
그래, 내가 필요한거야! 나는'parseRoute'을 발견했으나 취할 인수가 무엇인지 알 수 없었습니다. 필자가 작성한 코드를 사용하여 내 질문을 편집 했으므로 멋지게 작동합니다. – MaxGabriel