Pregunta

¿Es posible hacer algo como lo siguiente:

public void doStuff(@RequirePrivilege("foo") User user) {
    // ...
}

y ¿se ha ejecutado efectivamente como si fuera el siguiente?

public void doStuff(User user) {
    if(!user.hasPrivilege("foo"))
        throw new UserHasInsufficientPrivileges(); // this is a RuntimeException
    // ...
}

Sé que Spring tiene varios tipos de soporte AOP, pero lo mejor que pude encontrar fue el código AOP que fue anotado para que se ejecute antes o después de un método específico. Quiero hacer lo inverso y anotar el código que se debe cambiar.

Finalmente, podría hacer la verificación anterior dentro del método, pero la forma de anotación de hacer las cosas proporciona documentación adicional que hace obvio que el usuario requiere un privilegio particular sin tener que mantener la documentación sincronizada con el código.

¿Fue útil?

Solución

Puede usar AspectJ para hacer esto, ya que coincidirá con las anotaciones. Luego puede usar un aspecto aproximado para decidir si el usuario cumple con los requisitos para usar este método.

Spring le permite usar AspectJ, y le sugiero que, si es posible, no lo haga en tiempo de ejecución, sino en tiempo de compilación, ya que no hay razón para pagar el precio por usar este aspecto cada vez que inicia la aplicación . Pero, si debe hacerlo en tiempo de ejecución, entonces eso es factible, para mí trato de usar el tiempo de compilación tanto como sea posible.

Es posible que desee ver AspectJ en acción ( http://www.manning.com/laddad2/ ) pero aquí hay un ejemplo a partir de ahí: Patrón de firma:

* *(@RequestParam
(@Sensitive *))

Descripción

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

Ejemplo

void create(@RequestParam
MedicalRecord mr), assuming
MedicalRecord carries the
@Sensitive annotation.

Otros consejos

Estoy seguro de que sus " privilegios insuficientes " ejemplo se puede hacer con Spring AOP , porque eso es cómo funciona Spring Security. Puede hacer algunas cosas muy sofisticadas con consejos generales y AspectJ.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top