Pregunta ¿Puedo usar expresiones en las anotaciones de seguridad de Apache Shiro?


He estado haciendo algunas comparaciones entre Apache Shiro y Spring Security. Me encanta el modelo de seguridad que utiliza Shiro y creo que es mucho más limpio que Spring Security.

Sin embargo, una gran idea sería poder hacer referencia a los parámetros del método desde las anotaciones de seguridad de nivel de método. Por ejemplo, ahora podría algo así como:

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

En el contexto de este ejemplo, esto significa que el usuario autenticado debe tener permiso para enviar correos electrónicos en cuentas de correo electrónico.

Sin embargo, esto no es lo suficientemente detallado, ya que quiero permisos de nivel de instancia. En este contexto, suponga que los usuarios pueden tener permisos en instancias de cuentas de correo electrónico. Entonces, me gustaría escribir el código anterior algo como esto:

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

De esta forma, la cadena de permisos hace referencia a un parámetro que se pasa al método de modo que el método se puede proteger contra una instancia particular de EmailAccount.

Sé que podría hacer esto fácilmente desde código Java simple dentro del método, pero sería genial lograr lo mismo usando anotaciones: sé que Spring Security admite las expresiones Spring EL en sus anotaciones.

¿Definitivamente no es una característica de Shiro y por lo tanto, tendré que escribir mis propias anotaciones personalizadas?

Gracias,

Andrés


32
2017-07-27 10:06


origen


Respuestas:


Mira las clases en http://shiro.apache.org/static/current/apidocs/org/apache/shiro/authz/aop/package-summary.html, especialmente PermissionAnnotationHandler. Ahí puedes ver que todo lo que Shiro hace al encontrar el @RequiresPermissions la anotación es llamada getSubject().isPermitted(permission) y no hace ninguna sustitución dentro del valor de la anotación. Debería de alguna manera anular ese controlador si quisiera este tipo de funcionalidad.

Entonces, para responder a su pregunta: sí, definitivamente esta no es una característica de Shiro y debe escribir su propia anotación o anularla de alguna manera.


6
2017-08-24 13:03



Esta característica no es actualmente compatible con Shiro. Varias personas han solicitado esta característica. Tal vez podamos votar por el problema?

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


2
2017-12-14 02:42