2009-02-05 11 views
15

Sono un po 'perso perché la molla non impone l'@Secured ("ROLE_USER") sulla mia interfaccia di servizio. I miei controller sono stabiliti usando le annotazioni.non applicare le annotazioni sulla sicurezza del metodo

Un esempio della mia interfaccia di servizio

public interface MyServiceManager { 

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

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

mia sicurezza al contesto:

<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> 

risposta

7

Avete la dichiarazione

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

nello stesso file di configurazione di quello che si definito il bean MyServiceManager? Ho avuto lo stesso problema fino a quando ho attivato debug per org.springframework e ho notato che la sicurezza di primavera era applicata solo sullo stesso file di quelli in cui era definita la sicurezza del metodo globale.

+0

Sto importando la sicurezza-context.xml e datasource-context.xml nella applicationContext.xml. Il passaggio a sembrava risolvere il problema del ruolo di sicurezza del percorso dell'URL. ma non il problema di sicurezza del metodo. – IaCoder

+0

Sì, la parte importante è che si dispone della sicurezza del metodo globale nello stesso contesto di Spring dei componenti. –

1

Prova a mettere le annotazioni sul classe di implementazione invece dell'interfaccia e vedere se funziona. Ho finito per farlo in un progetto recente perché stavo usando anche l'attributo @Transactional sul mio livello di servizio, e i documenti di Spring consigliano di metterli sulla classe e non sull'interfaccia. Non so se lo stesso problema potrebbe riguardare @Secured, ma volevo mantenere le annotazioni nello stesso posto. Vedi il Spring Docs

Per quanto riguarda la risposta di Kent Lai ... è una buona idea ... assicurarsi che il file di configurazione di sicurezza venga effettivamente incluso da Spring.

2

Dopo aver fatto ulteriori ricerche su questo problema sono giunto alla seguente conclusione/soluzione. Non sono sicuro che sia corretto al 100% ... ma funziona.

Ho inserito tutta la mia configurazione nel file dispatcher-servlet.xml. Quindi, invece di avere un disptacher-servlet.xml e application-context.xml. Il dispatcher-servlet.xml viene caricato dall'applicazione (contextConfigLocation). All'interno del dispatcher-servlet.xml importare il mio security-context.xml e datasource-context.xml. Afer quello, tutto funziona.

2

Ho avuto lo stesso problema. Usando le informazioni della risposta di Kent Lai qui, sono stato in grado di risolverlo.

ho messo l'elemento <global-method-security> nel mio app-servlet.xml ma tenne le definizioni di sicurezza separarsi in security.xml, dove web.xml ha contextConfigLocation per app-servlet.xml e security.xml.

Ora funziona come un incantesimo!

+0

Il modo in cui l'ho capito è un po 'ridondante per definire il file app-servlet.xml come parte di contextConfigLocation. Se si utilizza DispatcherServlet, verrà caricato il proprio servletname-servlet.xml che eredita WebApplicationContext. In questo caso, mi sembra che i bean vengano prima creati una volta nel tuo WebApplicationContext dal tuo ContextLoader e quindi sovrascritti con le stesse definizioni un'altra volta da DispatcherServlet. – Sam

+0

Wow, dovrò controllarlo. Grazie! –

+0

@Sam e @Joe In realtà non è ridondante perché separano le cose. Se si inserisce il percorso -servlet.xml, verrà creato un contesto applicazione figlio il cui padre è WebApplicationContext. @Joe probabilmente ha funzionato perché non ha un contesto figlio (app-servlet e sicurezza si trovano nello stesso contesto). –

1

hai usato qualcosa di simile nel tuo 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> 

io non so perché, ma se uso il DispatcherServlet non ero in grado di far rispettare le annotazioni di sicurezza

4

Nel mio caso , la posizione esatta di questa affermazione:

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

si è rivelato molto importante. Assicurati di metterlo dopo il dichiarando quali classi devono essere scansionate e utilizzate come controller.

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

Questo è il modo per fare in modo che le annotazioni @Secured anche entrare in partita

+12

Non è così importante che sia dopo la scansione dei componenti, deve solo essere nello stesso file! –

0

Ho avuto questo stesso problema. Dopo ho aggiunto:

<context:annotation-config /> 

nel mio file primavera-security.xml è sparito.

Spero che questo vi aiuterà qualcuno :)

Problemi correlati