2014-10-29 61 views
3

我正在實施跨所有請求的全局篩選器,以確定發出請求的用戶是否已通過身份驗證,以及是否將它們發送到登錄屏幕。發送未經身份驗證的請求到不同的操作路由

我延長其使用的身份驗證篩選器的WithFilters類全局對象:

object Global extends WithFilters(AuthenticationFilter()) { } 

我的身份驗證篩選器:

class AuthenticationFilter extends Filter { 
    def apply(next: (RequestHeader) => Future[Result])(request: RequestHeader): Future[Result] = { 
    println("this is the request that will be filtered: " + request) 
    if (!authenticated) 
     // How do i send the request to the login Action? 
    else 
     next(request) 
    } 
} 

object AuthenticationFilter { 
    def apply(actionNames: String*) = new AuthenticationFilter() 
} 

我的問題是我怎麼去發送一個未認證用戶的登錄行動/路線?

+0

我認爲這將是如果你使用Spring,那麼容易得多。只是一個想法 – jlars62 2015-04-01 18:50:15

回答

0

爲安全路線創建一個特徵。在這種性質時,未認證的請求進來他們重定向:

trait Secured { 

/**  
* Retrieve the connected user name from the request header. 
*/ 
private def username(request: RequestHeader) = request.session.get("username") 

/**  
* Redirect to login if the user in not authorized.  
*/ 
private def onUnauthorized(request: RequestHeader) = Results.Redirect(routes.Application.login) 


/**  
* Action for authenticated users.  
*/ 
def IsAuthenticated(f: => String => Request[AnyContent] => Result) = Security.Authenticated(username, onUnauthorized) { user => 
    Action(request => f(user)(request)) 
} 


} 

現在定義要固定,以便擴展特性的任何控制器和身份認證的請求會被送走:

object Index extends Controller with Secured 
+0

問題是,我不想爲特定的控制器或操作創建身份驗證,我想驗證每個請求的身份驗證。 – 2014-10-29 17:14:26

+0

我不認爲你可以在全局對象上做到這一點,因爲至少有一個請求(登錄頁面)將不得到認證 – Gangstead 2014-10-29 17:26:41

+0

讓我們假設這是有效的。我將如何轉發請求到登錄行動 – 2014-10-29 17:33:21

相關問題