Вопрос

Я использую Grails, чтобы создать приложение, которое функционирует в основном в качестве сервисной структуры. Мой вопрос: могут быть защищены услуги того же моды, что и контроллеры?

На основании URI пример:

class SecurityFilters {
  def filters = {
    all(uri: "/**") {
      before = {
        // Ignore direct views (e.g. the default main index page).
        if (!controllerName) return true
        // Access control by convention. 
        accessControl()
      }
    } 
  } 
}
Это было полезно?

Решение

Я понятия не имею, если плагин Shiro поддерживает это, но Acegi плагин Есть ли, хотя и в «экспериментальной» моде (все, что значит).

Обновлять

Прочитав вопрос правильно, кажется, вы спрашиваете, можете ли вы использовать фильтры для защиты услуг. Если это так, то Широ несколько не имеет значения, потому что это фильтры, которые выполняют разрешение, а не Широ.

Итак, чтобы ответить на ваш вопрос о том, можете ли вы использовать фильтры для защищенных услуг, ответ нет, потому что у вас есть только доступ к контроллеру из фильтра. Однако вы можете использовать Groovy MetaProgramming, чтобы сделать перехват метода стиля AOP на услуги.

Основной подход:

  • Для каждого сервиса добавьте invokeMethod Собственность в метаклас
  • Значение этого свойства должно быть закрытием. Это закрытие будет перехватывать (то есть называться вместо) каждая методом, вызываемым на службе.
  • Это закрытие должно
    • Выполнить проверку безопасности
    • Вызвуть оригинальный метод, если авторизация успешна и бросает исключение (или показать ошибку), если авторизация не удается

В стороне

Если вообще возможно, я настоятельно рекомендую использовать проверенный плагин безопасности (например, Shiro, ACEGI), чтобы выполнить проверку авторизации, а не прокатиться в соответствии с тем, как описано выше.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top