Могу ли я ввести код весной, используя аннотации AOP? - PullRequest
3 голосов
/ 19 июня 2009

Можно ли сделать что-то вроде следующего: </p> <pre><code>public void doStuff(@RequirePrivilege("foo") User user) { // ... }

и эффективно ли он работает, как если бы это было следующим? </p> <pre><code>public void doStuff(User user) { if(!user.hasPrivilege("foo")) throw new UserHasInsufficientPrivileges(); // this is a RuntimeException // ... }

Я знаю, что Spring имеет различные виды поддержки AOP, но лучшее, что я смог найти, был код AOP, который был аннотирован так, чтобы он выполнялся до или после определенного метода. Я хочу сделать обратное и аннотировать код, который должен быть изменен.

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

Ответы [ 2 ]

1 голос
/ 24 сентября 2009

Вы можете посмотреть на использование AspectJ для этого, так как оно будет соответствовать аннотациям. Затем вы можете использовать внешний аспект, чтобы решить, соответствует ли пользователь требованиям для использования этого метода.

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

Возможно, вы захотите взглянуть на AspectJ In Action (http://www.manning.com/laddad2/), но вот пример оттуда: Образец подписи:

* *(@RequestParam
(@Sensitive *))

Описание

*Any method with one parameter marked with the @RequestParam annotations and the parameter’s type is marked with the @Sensitive annotation.*

Пример

void create(@RequestParam
MedicalRecord mr), assuming
MedicalRecord carries the
@Sensitive annotation.
1 голос
/ 19 июня 2009

Я уверен, что ваш пример "недостаточных привилегий" может быть сделан с Spring AOP , потому что именно так работает Spring Security. Вы можете делать некоторые очень сложные вещи с помощью советов и AspectJ.

...