Me gustaría crear una clase que agregue métodos personalizados para usar en el lenguaje de expresión de seguridad de Spring para la autorización basada en métodos a través de anotaciones.
Por ejemplo, me gustaría crear un método personalizado como 'customMethodReturningBoolean' para usarlo de alguna manera así:
@PreAuthorize("customMethodReturningBoolean()")
public void myMethodToSecure() {
// whatever
}
Mi pregunta es esta. Si es posible, ¿qué clase debería subclase para crear mis métodos personalizados, cómo haría para configurarlo en los archivos de configuración xml de primavera y si alguien me da un ejemplo de un método personalizado utilizado de esta manera?
java
spring
spring-security
Paul D. Eden
fuente
fuente
Respuestas:
Necesitará subclasificar dos clases.
Primero, establezca un nuevo controlador de expresión de método
myMethodSecurityExpressionHandler
será una subclase de laDefaultMethodSecurityExpressionHandler
que anulacreateEvaluationContext()
, estableciendo una subclase deMethodSecurityExpressionRoot
en elMethodSecurityEvaluationContext
.Por ejemplo:
fuente
MethodSecurityExpressionRoot
ser privado de paquetes ?Ninguna de las técnicas mencionadas funcionará más. Parece que Spring ha hecho todo lo posible para evitar que los usuarios anulen SecurityExpressionRoot.
EDITAR 19/11/14 Configure Spring para usar anotaciones de seguridad:
Crea un frijol como este:
Luego haz algo como esto en tu jsp:
O anote un método:
Además, puede usar Spring Expression Language en sus
@PreAuthorize
anotaciones para acceder a la autenticación actual, así como a los argumentos del método.Por ejemplo:
Luego actualice su
@PreAuthorize
para que coincida con la nueva firma del método:fuente
Authentication auth = SecurityContextHolder.getContext().getAuthentication();
para obtener el token de autenticación actual.Gracias ericacm , pero no funciona por algunas razones:
Las diferencias son que llamamos al método createEvaluationContext existente y luego agregamos nuestro objeto raíz personalizado. Finalmente, acabo de devolver un tipo de objeto StandardEvaluationContext ya que MethodSecurityEvaluationContext no se resolvería en el compilador (ambos son de la misma interfaz). Este es el código que ahora tengo en producción.
Haga que MethodSecurityExpressionHandler use nuestra raíz personalizada:
Esto reemplaza la raíz predeterminada al extender SecurityExpressionRoot . Aquí he cambiado el nombre de hasRole a hasEntitlement:
Finalmente, actualice securityContext.xml (y asegúrese de que se haga referencia a él desde su applcationContext.xml):
Nota: la anotación @Secured no aceptará esta anulación ya que se ejecuta a través de un controlador de validación diferente. Entonces, en el xml anterior, los desactivé para evitar confusiones posteriores.
fuente