2012-08-01 20 views
5

Me gustaría crear reglas de seguridad basadas en parámetros de url personalizados (variables de ruta). En el ejemplo. Supongamos que quiero tener un usuario que tenga acceso de administrador para los recursos llamados Brand1 y Brand2, pero que no tenga acceso al recurso llamado Brand3. Podemos editar recursos usando los siguientes enlaces.Seguridad de primavera con parámetros de variable de ruta

http://myapp/brand/edit/1 
http://myapp/brand/edit/2 
http://myapp/brand/edit/3 

ahora en el contexto de seguridad me gustaría hacer algo así

<security:intercept-url pattern="/brand/edit/{brandId}" 
      access="hasRole('ROLE_ADMIN') or 
        @authorizationService.hasBrandPermission(
        #brandId, principal.username)"/> 

Lo único que consigo es nombre de usuario. BrandId siempre es nulo. Solía ​​hacer eso con @PreAuthorize y funcionó, pero ahora me gustaría centralizar la configuración de seguridad en un único archivo xml en lugar de distribuirlo entre todas las clases de controlador. Además, cuando estaba usando @PreAuthorize mi access-denied-handler no me redirigió a la página denegada sino que mostraba la fea entrada AccessDeniedException.

Realmente apreciaría cualquier idea.

+0

No entiendo el problema. ¿Es que BrandId siempre es nulo? ¿O es que no protege el recurso? ¿O es la fea página AccessDeniedException? –

+0

BrandID es nulo –

Respuesta

1

puede intentar usar la expresión regular.

tendrá que añadir el atributo ruta-type = "expresiones regulares" en su elemento http o petición de coincidencias = "expresiones regulares" si el uso de la seguridad de primavera 3,1

ver la documentación para más detalles

+0

Creo que la expresión regular solo sirve para definir patrones de URL, no para hacer referencia a la variable de ruta. es decir, puedo hacer algo así "/path/to/*.html" para que aplique todas las URL que coincidan con el patrón, pero lo que me interesa es "/ ruta/a/recurso/{resourceId}" y obtener el valor de resourceId en ' acceso 'sección por lo que access = "@ myService.mySecurityMethod (#resourceId)" –

1

cambiar la versión de Seguridad de la primavera en su pom.xml a 4.1.0.RELEASE:

<spring-security.version>4.1.0.RELEASE</spring-security.version> 

<dependency> 
    <groupId>org.springframework.security</groupId> 
    <artifactId>spring-security-web</artifactId> 
    <version>${spring-security.version}</version> 
</dependency> 

Es posible que tenga que limpiar su proyecto de maven después de eso.

(Lo sé, es una vieja pregunta. Sin embargo, me enfrenté al mismo problema 3 años después).

+0

¿Cómo se relaciona esto con la pregunta? – tunix

Cuestiones relacionadas