Sono un po 'confuso con il pattern URL in spring security. Perché, nella sicurezza http del nucleo servlet, i modelli di URL /
e /*
vengono utilizzati per specificare una o più directory. /
è utilizzato per una directory e /*
è utilizzato da molte directory. Ma nella sicurezza di primavera viene anche introdotto lo /**
, qual è lo scopo principale del modello di URL /**
in sicurezza.Spring Security: Differenza tra/** e/* url pattern in Spring-Security
risposta
Secondo la documentazione Primavera di sicurezza lo scopo principale di /**
è quello di catch-tutti i caratteri jolly:
In pratica si consiglia di utilizzare la sicurezza metodo al vostro livello di servizio, per controllare l'accesso alla vostra applicazione , e non fare interamente affidamento sull'uso dei vincoli di sicurezza definiti a livello di applicazione web. Gli URL cambiano ed è difficile tenere conto di tutti gli URL possibili che un'applicazione potrebbe supportare e come le richieste potrebbero essere manipolate. Dovresti provare a limitarti a utilizzare alcuni semplici percorsi di formica che sono semplici da comprendere. Cerca sempre di utilizzare un approccio "deny-by-default" in cui hai un carattere jolly catch-all (/ ** o **) definito ultimo e negando l'accesso.
Inoltre non bisogna dimenticare che
I modelli sono sempre valutate nell'ordine in cui sono definiti. Pertanto è importante che i modelli più specifici siano definiti più in alto nell'elenco rispetto a modelli meno specifici.
Così si può avere qualcosa di simile:
<security:http pattern="/rest-service/**" authentication-manager-ref="authenticationManager" auto-config="false" access-decision-manager-ref="accessDecisionManager">
<security:intercept-url pattern="/rest-service/report/export/xml" access="AUTH_REPORT_EXPORTXML" />
<security:intercept-url pattern="/**" access="AUTH_SYSTEM_LOGIN" />
<security:http-basic />
</security:http>
che significa che per tutte le richieste avremo bisogno di autorità AUTH_SYSTEM_LOGIN, ma in particolare per i/resto servizio/rapporto/export/xml l'utente dovrà AUTH_REPORT_EXPORTXML anche perché è definito sopra. Come dicono anche che è meglio non contare solo su questo vincoli di sicurezza che significa che è bene anche duplicare quelle in metodi di servizio con annotazione assicurato in questo modo:
@Secured("AUTH_REPORT_EXPORTXML")
In generale mi pare di capire non v'è alcuna differenza tra /*
e /**
eccetto che l'ultimo cattura tutti i caratteri jolly.
La differenza tra/* &/** è che il secondo corrisponde all'intero albero delle directory, comprese le sottodirectory, dove come * corrisponde solo al livello in cui è specificato in.
@Override
protected void configure(HttpSecurity http) throws Exception {
// ...
.antMatchers(HttpMethod.GET, "/**").permitAll
.antMatchers(HttpMethod.POST, "/*").permitAll
// ...
}
In questa configurazione qualsiasi "Get" sarà consentito di richiesta, ad esempio:
- /libro
- /libro/20
- /libro/20/autore
Quindi, tutti questi URL corrispondono al testo con il modello "/ **".
URL permessi per "Messaggio":
- /libro
- /rivista
Urls sopra match con "/ *"