2014-12-14 2 views
2

Этот вопрос может иметь немного философский аспект.Deadbolt 2 Функция ограничения имеет только один возможный код ошибки

Я использую Deadbolt 2 (Scala) в своем приложении для воспроизведения, и он работает достаточно хорошо.

Глядя на (строка 47) Restrict function definition я заметил, что он не будет вызывать onAuthFailure по одной из следующих причин:

  1. Нет пользователей в сессии (без темы)
  2. Действие не указано ни одной роли.
  3. Пользователь попытался выполнить действие, для которого у них не было одной или нескольких требуемых ролей.

В пользовательском интерфейсе приложения я хотел бы получить другой код состояния для каждого из них, чтобы пользователь, который не вошел в систему (условие 1), будет перенаправлен на страницу входа, но условие 3 будет более изящным обрабатываются только предупреждением (поскольку они не могут навредить и, возможно, случайно попытались отредактировать, когда у них есть доступ только для чтения - возможно, ошибка UI, но вход в систему снова немного драконен).

Если бы мне пришлось договориться только о двух кодах статуса, я бы хотел различать 1 и другое 2. Я вижу, как это можно было бы сделать, но хотелось бы получить другие мнения по существу даже это.

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

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

ответ

0

Я решил просто добавить код, чтобы различать условия 1 и 2 или 3 следующим образом:

В MyDeadboltHandler:

class MyDeadboltHandler(dynamicResourceHandler: Option[DynamicResourceHandler] = None) extends DeadboltHandler { 
... 
    def onAuthFailure[A](request: Request[A]): Result = { 
    Logger.error("authentication failure") 
    val json = new JsonStatus("Failed to authenticate", -1).toJson.toString 
    if(noUserInSession(request)){ 
     Results.Forbidden(json).withHeaders("Access-Control-Allow-Origin" -> "*") 
    } 
    else{ 
     Results.Unauthorized (json).withHeaders("Access-Control-Allow-Origin" -> "*") 
    } 
    } 

    def noUserInSession(request:RequestHeader) = { 
    username(request) match { 
     case Some(u:String) => false 
     case _ => true 
    } 
    } 

Это хорошо работает для меня, и не накладывает на основной Функциональность Deadbolt-2.

+0

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

+0

как имитировать эти функции при запуске scala Test – user170114

Смежные вопросы