2014-10-29 2 views
3

Я реализую глобальный фильтр по всем запросам, чтобы идентифицировать, что пользователь, выполняющий запрос, проходит проверку подлинности и не отправляет их на экран входа в систему.Отправлять неавторизованный запрос на другой маршрут действия

Мой Глобальный объект расширения класса WithFilters, который с помощью фильтра аутентификации:

object Global extends WithFilters(AuthenticationFilter()) { } 

Мой фильтр Authentication:

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() 
} 

Мой вопрос, как я могу идти об отправке неавторизованный пользователь в login Действие/маршрут?

+0

Я думаю, что это будет намного проще, если вы использовали Spring. Просто мысль – jlars62

ответ

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

Проблема в том, что я не хочу создавать аутентификацию для определенных контроллеров или Actions, я хочу, чтобы проверка подлинности проверялась для каждого запроса. –

+0

Я не думаю, что вы сможете сделать это на глобальном объекте, потому что хотя бы один запрос (страница входа) не должен быть аутентифицирован – Gangstead

+0

Предположим, что это работает. Как бы я перенаправил запрос на действие входа –