2014-10-04 6 views
2

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 

답변

1

parseRoute은 당신이 찾고있는 무엇을 제공 하는가 : 여기에 내가 무엇을 최대 온입니까? pathInfoqueryString으로 팀을 구성하면됩니다.

+1

그래, 내가 필요한거야! 나는'parseRoute'을 발견했으나 취할 인수가 무엇인지 알 수 없었습니다. 필자가 작성한 코드를 사용하여 내 질문을 편집 했으므로 멋지게 작동합니다. – MaxGabriel