2014-09-07 4 views
0

Я строю черту безопасности с помощью AuthenticatedBuilder:Использование onUnauthorized() в действии контроллера, полученного из AuthenticatedBuilder

trait Security { self: Controller => 
    object AuthenticatedAction extends AuthenticatedBuilder 
     (request => getUserFromRequest(request)) 
} 

У меня есть реализация в этой черты для этой функции:

def getUserFromRequest(request: RequestHeader) = { 
    // ...whatever... 
} 

Эта функция ищет токен аутентификации в запросе, проверяет его и сопоставляет с идентификатором пользователя, который затем используется для поиска пользователя в базе данных. Если все хорошо, возвращается экземпляр User, в противном случае - Нет. Это часть более широкой схемы аутентификации, которая в значительной степени основана на проекте github для игровых углов. Дублирование всего этого кода здесь избыточно, достаточно сказать, что этот метод возвращает User или None, чтобы обозначить аутентификацию.

Это позволяет мне написать контроллер, как это:

object Accounts extends Controller with Security { 
    def list = AuthenticatedAction { implicit request => 
     // I can use request.user here to implement authorisation as needed 
     Ok(toJson(Account.list)) 
    } 
} 

В этом Controller из-за AuthenticatedAction я гарантированно иметь User экземпляр доступного по стоимости request.user. Если нет авторизованного пользователя, сам блок кода не выполняется и возвращает результат Forbidden.

Все это прекрасно и работает очень хорошо.

У меня есть один потребительной случай, когда мне нужно сделать всю эту проверку подлинности, но сделать некоторые пользовательские обработки несанкционированного случая - то есть я хочу, чтобы выполнить свой собственный блок кода в этот контроллере при пропадании авторизации.

Я знаю, что AuthenticatedBuilder может принять такую ​​функцию в процессе строительства:

def apply[U](userinfo: (RequestHeader) ⇒ Option[U], 
    onUnauthorized: (RequestHeader) ⇒ Result = ...): AuthenticatedBuilder[U] 

Я новичок в Scala, и я не могу понять синтаксис/изменения, которые необходимо передать такую ​​функцию от моего Controller через мой AuthenticatedAction объект AuthenticatedBuilder. В идеале я бы передал необязательный параметр onUnauthorized, или я мог бы иметь отдельную реализацию AuthenticatedAction, я полагаю.

Как это сделать?

+0

Редактирование во всех этих обратных окнах действительно улучшает читаемость, да? – caprica

ответ

1

Объекты не могут иметь списки параметров, поэтому вам необходимо использовать метод и создать действие «на лету».

def Authenticated(unauth: RequestHeader => Result) = 
    new AuthenticatedBuilder(getUserFromRequest, unauth) 
Смежные вопросы