Tengo el siguiente método de servicio en mi aplicación:
@Override @Secured({Authority.ACCESS_FUNDING}) @PreAuthorize("hasPermission(principal, 'MODIFY')") public FundingAllocation newFundingAllocation(FundingAllocationForm fundingAllocationForm) { return newFundingAllocation(fundingAllocationForm, null); } Pero noté que la anotación @Secured se ignora y solo se realiza la verificación @PreAuthorize .
Tengo la siguiente configuración de seguridad de primavera:
<security:global-method-security secured-annotations="enabled" pre-post-annotations="enabled"> <security:expression-handler ref="securityExpressionHandler"/> </security:global-method-security>¿Alguien sabe si es posible combinar anotaciones en un método?
Según el Javadoc sobre DelegatingMethodSecurityMetadataSource , utilizará la primera fuente de metadatos que encuentre. Así que no se pretende mezclar los dos. El fundamento también se explica en https://github.com/spring-projects/spring-security/issues/2116
Los documentos oficiales también indican:
Puede habilitar más de un tipo de anotación en la misma aplicación, pero solo se debe usar un tipo para cualquier interfaz o clase, ya que, de lo contrario, el comportamiento no estará bien definido. Si se encuentran dos anotaciones que se aplican a un método en particular, solo se aplicará una de ellas.
Así que simplemente no lo hagas y escribe la expresión correcta en tu @PreAuthorize :
@PreAuthorized("hasAuthority('ACCESS_FUNDING') and hasPermission(principal, 'MODIFY')")como sugiere la respuesta de jmw5598.
Con @PreAuthorize y @PostAuthorize puede combinar expresiones con los operadores and y or .
@Override @PreAuthorized("hasAuthority('ACCESS_FUNDING') and hasPermission(principal, 'MODIFY')") public FundingAllocation newFundingAllocation(FundingAllocationForm fundingAllocationForm) { return newFundingAllocation(fundingAllocationForm, null); }Espero que esto sea útil.
http://docs.spring.io/spring-security/site/docs/current/reference/html/el-access.html