Подтвердить что ты не робот

Могу ли я использовать выражения в аннотациях безопасности Apache Shiro?

Я делал некоторые сравнения между Apache Shiro и Spring Security - я действительно люблю модель безопасности, которую использует Широ, и считаю, что она намного чище, чем Spring Безопасность.

Тем не менее, одна большая приятная задача - иметь возможность ссылаться на параметры метода из аннотаций безопасности на уровне метода. Например, прямо сейчас я мог бы что-то вроде:

@RequiresPermissions("account:send:*")
public void sendEmail( EmailAccount account, String to, String subject, String message) { ... }

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

Однако, это недостаточно тонко, так как я хочу разрешения на уровне экземпляра! В этом контексте предположим, что пользователи могут иметь разрешения на экземпляры учетных записей электронной почты. Итак, я хотел бы написать предыдущий код примерно так:

@RequiresPermissions("account:send:${account.id}")
public void sendEmail( EmailAccount account, String to, String subject, String message) { ... }

Таким образом, строка разрешений ссылается на параметр, переданный в метод таким образом, что метод может быть защищен от конкретного экземпляра EmailAccount.

Я знаю, что я мог бы легко сделать это из простого Java-кода в этом методе, но было бы здорово добиться того же, используя аннотации - я знаю Spring Безопасность поддерживает выражения Spring EL в своих аннотациях.

Это определенно не особенность Сиро, и поэтому мне придется писать собственные аннотации?

Спасибо,

Эндрю

4b9b3361

Ответ 1

Посмотрите на классы в http://shiro.apache.org/static/current/apidocs/org/apache/shiro/authz/aop/package-summary.html, особенно PermissionAnnotationHandler. Там вы можете видеть, что все Сиро делает, когда встречается аннотация @RequiresPermissions - это вызов getSubject().isPermitted(permission) и вообще не замещает внутри значения аннотации. Вам нужно было бы как-то переопределить этот обработчик, если бы вы хотели использовать эту функциональность.

Итак, чтобы ответить на ваш вопрос: да, это определенно не особенность Сиро, и вам нужно либо написать свою собственную аннотацию, либо каким-то образом переопределить этот обработчик.