Главная » Spring » Защита методов Spring

0

Как уже упоминалось выше, безопасность – это аспектно-ориен- тированное понятие. Поэтому в основе обеспечения безопасности на уровне методов в Spring Security лежит Spring AOP. Но вам едва ли придется напрямую сталкиваться с аспектами Spring Security. Все детали использования AOP, связанные с обеспечением безопасности методов, скрыты в единственном элементе: <global-method-security>. Ниже демонстрируется типичный пример использования <global- method-security>.

<global-method-security  secured-annotations="enabled"  />

Он настраивает Spring Security на обеспечение безопасности ме- тодов, отмеченных собственной аннотацией Spring Security: @Secured. Это лишь один из четырех возможных способов защиты методов, поддерживаемых фреймворком Spring Security:

# с помощью аннотации @Secured;

# с помощью аннотации JSR-250: @RolesAllowed;

# с помощью аннотаций Spring, проверяющих условия до и пос- ле вызова метода;

# посредством сопоставления метода с одним или более мно-

жествами точек внедрения.

Рассмотрим каждый из способов по очереди.

Защита методов с помощью аннотации @Secured

Когда в атрибуте secured-annotations элемента <global-method- security> указывается значение enabled, создается множество точек внедрения, благодаря чему аспекты Spring Security получают воз- можность обернуть методы компонентов, отмеченные аннотацией

@Secured. Например:

@Secured("ROLE_SPITTER")

public  void  addSpittle(Spittle  spittle)  {

// …

}

Аннотация @Secured принимает массив строк. Каждая строка опре- деляет привилегию, которой должен обладать пользователь, что- бы вызвать аннотированный метод. В данном случае фреймворку Spring Security сообщается, что он не должен позволять вызывать метод saveSpittle(), если пользователь не обладает привилегией ROLE_SPITTER.

Если аннотации @Secured передается несколько значений, для вы- зова защищенного метода пользователь должен обладать хотя бы одной из указанных привилегий. Например, следующий пример использования аннотации @Secured требует, чтобы пользователь об- ладал привилегией ROLE_SPITTER или ROLE_ADMIN:

@Secured({"ROLE_SPITTER",    "ROLE_ADMIN"})

public  void  addSpittle(Spittle  spittle)  {

// …

}

Если защищенный метод попытается вызвать неавторизованный пользователь или пользователь, не обладающий необходимыми привилегиями, аспект, обертывающий метод, возбудит одно из ис- ключений, реализованных в Spring Security (возможно, подкласс AuthenticationException или AccessDeniedException). В конечном счете исключение должно быть обработано приложением. Если вызов за- щищенного метода произойдет в процессе обработки веб-запроса, исключение будет автоматически обработано фильтрами Spring Security. Во всех остальных случаях вы должны будете написать собственный обработчик исключения.

Единственный недостаток аннотации @Secured – в том, что она яв- ляется аннотацией Spring. Те, кто предпочитает использовать стан- дартные аннотации, могут использовать аннотацию @RolesAllowed.

Использование аннотации JSR-250 @RolesAllowed

Аннотация @RolesAllowed является практически полным эквива- лентом аннотации @Secured. Единственное существенное отличие – в том, что аннотация @RolesAllowed является одной из стандартных аннотаций Java и определена в спецификации JSR-2501.

Эти различия в большей степени относятся к политической сто- роне дела, чем к технической. Перевес в пользу стандартной аннота- ции @RolesAllowed может быть обусловлен необходимостью использо- вания программного кода в контексте других фреймворков или API, обрабатывающих аннотацию.

Как бы то ни было, в случае выбора аннотации @RolesAllowed необ- ходимо включить ее поддержку, определив значение enabled в атри- буте  jsr250-annotations   элемента  <global-method-security>:

<global-method-security  jsr250-annotations="enabled"  />

1   http://jcp.org/en/jsr/summary?id=250.

Хотя в данном примере был определен только атрибут jsr250- annotations, следует отметить, что он не исключает возможности определения атрибута secured-annotations. Эти два атрибута могут указываться одновременно. Более того, их можно даже использовать совместно с аннотациями фреймворка Spring, выполняемыми до и после вызова метода, о которых рассказывается далее.

Источник:   Уоллс К., Spring в действии. – М.: ДМК Пресс, 2013. – 752 с.: ил.

По теме:

  • Комментарии