Я строю черту безопасности с помощью 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
, я полагаю.
Как это сделать?
Редактирование во всех этих обратных окнах действительно улучшает читаемость, да? – caprica