Могу ли я использовать выражения в аннотациях безопасности Apache Shiro? - PullRequest
33 голосов
/ 27 июля 2011

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

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

@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 Security поддерживает выражения Spring EL в своих аннотациях.

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

Спасибо

Andrew

Ответы [ 2 ]

6 голосов
/ 24 августа 2012

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

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

2 голосов
/ 14 декабря 2015

Эта функция в настоящее время не поддерживается Shiro. Несколько человек запросили эту функцию. Возможно, мы можем проголосовать за вопрос?

https://issues.apache.org/jira/browse/SHIRO-484

https://issues.apache.org/jira/browse/SHIRO-77

https://issues.apache.org/jira/browse/SHIRO-417

https://issues.apache.org/jira/browse/SHIRO-331

...