2014-04-21 57 views
1

我一直在試圖與Yesod一起玩,我遇到了一個非常簡單的問題,我似乎無法找到解決方案。相當於全球「before_filter」在Yesod

說我想擁有一個全局函數,它可以在每個請求上與路由或處理程序無關地運行(例如驗證函數)。說我要像

uid <- requireAuthId 

到每一個處理函數之前運行,並提供一個UID時,控制權返回給處理函數/如果它已經存在

我會在哪裏插槽呢?在過濾器之前做什麼'Yesod Way'?

+0

雖然不是回答你的問題,有一個在耶索德書上的認證和授權[章](http://stackoverflow.com/questions/23194322/equivalent-to-global-before-filter-in-yesod)這解釋了你描述的情況。 –

回答

2

這樣做的一種方法是修改您的基礎類型的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." 

很明顯,編輯這個來滿足您的需求,但它應該給你一個如何做到這一點的想法。