2009-02-05 20 views
15

Soy un poco perdido en cuanto a por qué la primavera no aplica el @Secured ("ROLE_USER") en mi interfaz de servicio. Mis controladores se establecen usando anotaciones.primavera no se aplica el método de anotaciones de seguridad

Un ejemplo de mi interfaz de servicio

public interface MyServiceManager { 

    @Secured("ROLE_USER") 
    public void delete(int cid); 

    @RolesAllowed({"ROLE_USER"}) 
    public Contact getContact(int contactId); 
} 

mi seguridad contexto:

<global-method-security secured-annotations="enabled" jsr250-annotations="enabled"> 
</global-method-security> 

<http auto-config="true" > 
    <intercept-url pattern="/secure/**" access="ROLE_SUPERVISOR" /> 
    <intercept-url pattern="/addcontact**" access="IS_AUTHENTICATED_REMEMBERED" /> 
    <intercept-url pattern="/**" access="IS_AUTHENTICATED_ANONYMOUSLY" /> 

    <concurrent-session-control max-sessions="1" 
     exception-if-maximum-exceeded="true"/> 
    <form-login login-page="/login.jsp" authentication-failure-url="/login.jsp?login_error=1"/> 
    <logout logout-success-url="/welcome.do" logout-url="/logout"/> 
</http> 
    <authentication-provider> 
    <password-encoder hash="md5"/> 
    <user-service> 
     <user name="rod" password="a564de63c2d0da68cf47586ee05984d7" authorities="ROLE_SUPERVISOR, ROLE_USER, ROLE_TELLER" /> 
    </user-service> 
</authentication-provider> 

Respuesta

7

¿Tiene la declaración

<global-method-security secured-annotations="enabled" jsr250-annotations="enabled" /> 

en el mismo archivo de configuración como la que se definido el bean MyServiceManager? Tuve el mismo problema hasta que activé la depuración para org.springframework, y me di cuenta de que la seguridad de primavera solo se aplicaba en el mismo archivo en el que se definía la seguridad de método global.

+0

estoy importando la seguridad y la fuente de datos context.xml-context.xml en el applicationContext.xml. Moverse hacia arriba parecía arreglar el problema del rol de seguridad de la ruta url. pero no el problema de seguridad del método. – IaCoder

+0

Sí, la parte importante es que tiene la seguridad de método global en el mismo contexto Spring que los componentes. –

1

Intenta poner las anotaciones en el clase de implementación en lugar de la interfaz y ver si eso funciona. Terminé haciéndolo en un proyecto reciente porque también estaba usando el atributo @Transactional en mi capa de servicio, y los documentos de Spring recomiendan ponerlos en la clase y no en la interfaz. No sé si el mismo problema podría aplicarse a @Secured, pero quería mantener las anotaciones en el mismo lugar. Consulte Spring Docs

Con respecto a la respuesta de Kent Lai ... esa es una buena idea ... asegúrese de que su archivo de configuración de seguridad esté siendo realmente incluido por Spring.

2

Después de investigar más sobre este problema llegué a la siguiente conclusión/solución. No estoy seguro de si es 100% correcto ... pero funciona.

Pongo toda mi configuración en el archivo dispatcher-servlet.xml. Entonces, en lugar de tener un disptacher-servlet.xml y application-context.xml. Dispatcher-servlet.xml es cargado por la aplicación (contextConfigLocation). Dentro del dispatcher-servlet.xml importo mi security-context.xml y datasource-context.xml. Después de eso, todo funciona.

2

Tuve este mismo problema. Usando la información de la respuesta de Kent Lai aquí, pude solucionarlo.

puse el elemento <global-method-security> en mi app-servlet.xml pero mantienen las definiciones de seguridad separar en security.xml, donde web.xml tiene contextConfigLocation para app-servlet.xml y security.xml.

¡Funciona como un encanto ahora!

+0

La forma en que entendí esto es un poco redundante para definir su archivo app-servlet.xml como parte de contextConfigLocation. Si usa DispatcherServlet, cargará su servletname-servlet.xml que hereda el WebApplicationContext. En este caso, me parece que sus beans se crearán primero una vez en su WebApplicationContext por su ContextLoader y luego serán anulados con las mismas definiciones en otro momento por su DispatcherServlet. – Sam

+0

Guau, tendré que comprobar eso. ¡Gracias! –

+0

@Sam y @Joe En realidad no es redundante porque separan cosas. Si coloca la ruta -servlet.xml, se creará un contexto de aplicación hijo cuyo padre es WebApplicationContext. @Joe probablemente lo hizo funcionar porque no tiene un contexto secundario (la aplicación y la seguridad están en el mismo contexto). –

1

¿Ha usado algo como esto en su web.xml

<servlet> 
    <servlet-name>name</servlet-name> 
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 
    <init-param> 
     <param-name>contextConfigLocation</param-name> 
     <param-value>/WEB-INF/spring/webmvc-config.xml</param-value> 
    </init-param> 
    <load-on-startup>1</load-on-startup> 
</servlet> 

No estoy seguro de por qué, pero si uso el DispatcherServlet yo no era capaz de hacer cumplir las anotaciones de seguridad

4

En mi caso , la ubicación exacta de esta declaración:

<global-method-security secured-annotations="enabled" > 

demostró ser muy importante. Asegúrese de ponerlo después de declara qué clases deben escanearse y usarse como controladores.

<context:component-scan base-package="com.test.controller" /> 

Esta es la manera de asegurarse de que las anotaciones @Secured también entrar en el juego

+12

No es tan importante que sea después del escaneo de componentes, ¡tiene que estar en el mismo archivo! –

0

que tenía este mismo problema. Después añadí:

<context:annotation-config /> 

en mi archivo de primavera-security.xml desapareció.

Esperamos que esto ayude a alguien :)

Cuestiones relacionadas