2014-03-31 12 views
9

Ich habe Spring-Web-Anwendung mit Spring-Sicherheit mit java Config-Ansatz konfiguriert. Ich möchte einige URL-Muster von der Authentifizierung ausschließen (zB: statische Ressourcen etc ..). Ich habe dies früher mit Spring-Sicherheit xml config getan, konnte aber nicht mit java config herausfinden, wie das Hinzufügen von antmatchers nicht hilft.Spring Security Ausschluss URL-Muster in der Sicherheitsanmerkung configurartion

Es folgt mein Code in Sicherheit Config-Klasse hinzugefügt WebSecurityConfigurerAdapter erstreckt

@Override 
public void configure(HttpSecurity http) throws Exception { 
    http.authorizeRequests() 
      .antMatchers("/authFailure") 
      .permitAll() 
      .anyRequest() 
      .authenticated() 
      .and() 
      .httpBasic() 
      .and() 
      .authenticationProvider(_provider) 
      .sessionManagement() 
      .sessionCreationPolicy(SessionCreationPolicy.STATELESS) 
      .and() 
      .addFilter(authFilter()) 
      .addFilterAfter(executionContextFilter(), 
        TokenBasedSecurityFilter.class).csrf().disable(); 
} 

Die Federsicherheitsversion, die ich benutze 3.2.0 ist. Vielen Dank im Voraus für die Unterstützung

Edit:

Der Stacktrace, die ich bekam, während die ausgeschlossene URL schlagen,

org.springframework.security.authentication.AuthenticationServiceException: Authorization Header is not available in the request 
    at com.inventory.ricemill.tba.spring.TokenBasedSecurityFilter.doFilter(TokenBasedSecurityFilter.java:59) 
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) 
    at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:110) 
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) 
    at org.springframework.security.web.header.HeaderWriterFilter.doFilterInternal(HeaderWriterFilter.java:57) 
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) 
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) 
    at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:87) 
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) 
    at org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:50) 
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) 
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) 
    at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:192) 
    at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:160) 
    at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:343) 
    at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:260) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) 
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222) 
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123) 
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502) 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171) 
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100) 
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:953) 
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118) 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408) 
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1041) 
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:603) 
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:310) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) 
    at java.lang.Thread.run(Thread.java:744) 

Apr 01, 2014 10:18:41 PM org.apache.catalina.core.StandardWrapperValve invoke 
SEVERE: Servlet.service() for servlet [Inventory] in context with path [/ricemill] threw exception [Request processing failed; nested exception is org.springframework.security.authentication.AuthenticationServiceException: Authorization Header is not available in the request] with root cause 
org.springframework.security.authentication.AuthenticationServiceException: Authorization Header is not available in the request 
    at com.inventory.ricemill.tba.spring.TokenBasedSecurityFilter.doFilter(TokenBasedSecurityFilter.java:59) 
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) 
    at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:110) 
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) 
    at org.springframework.security.web.header.HeaderWriterFilter.doFilterInternal(HeaderWriterFilter.java:57) 
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) 
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) 
    at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:87) 
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) 
    at org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:50) 
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) 
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) 
    at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:192) 
    at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:160) 
    at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:343) 
    at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:260) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) 
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222) 
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123) 
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502) 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171) 
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100) 
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:953) 
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118) 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408) 
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1041) 
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:603) 
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:310) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) 
    at java.lang.Thread.run(Thread.java:744) 

Die Anfrage geht durch die registrierten Filter im Frühjahr Sicherheitsfilterkette, während es sollte nicht, wie die Anfrage mit antmatcher ignoriert wird

Antwort

34

Gefunden die Lösung in Spring Sicherheitsbeispiele in Github veröffentlicht.

WebSecurityConfigurerAdapter hat eine überladene configure Nachricht, die WebSecurity als Argument akzeptiert, die Ant-Matcher auf Anfragen ignoriert werden akzeptiert.

@Override 
public void configure(WebSecurity web) throws Exception { 
    web.ignoring().antMatchers("/authFailure"); 
} 

Siehe Spring Security Samples für weitere Details

+0

Das hat den Trick für mich getan. Vielen Dank! Ich konnte alle ignorierten Übereinstimmungen wie Anmeldeformular, Abmeldeseite, statische Ressourcen usw. hinzufügen und dann .anyRequest.authenticated() in meiner configure (HttpSecurity http) -Methode beibehalten. –

+0

Overriding configure (WebSecurity) scheint richtig zu sein, so weit der Standard sagt. https://stackoverflow.com/questions/22998731/httpsecurity-websecurity-and-authenticationmanagerbuilder – Vaibs

5

Wenn Sie sagen, antMatchers hinzufügen hilft nicht - was meinst du? AntMatchers ist genau wie Sie es tun. So etwas wie die folgenden funktionieren sollte (natürlich Ihre URL entsprechend zu ändern):

@Override 
    public void configure(HttpSecurity http) throws Exception { 
     http.authorizeRequests() 
       .antMatchers("/authFailure").permitAll() 
       .antMatchers("/resources/**").permitAll() 
       .anyRequest().authenticated() 

Wenn Sie noch keine Freude haben, dann müssen Sie mehr Details bieten/stacktrace usw.

Details of XML to Java config switch is here

+0

Dank für Ihre Antwort, habe ich den Stapel hinzugefügt Spur in der Frage. –

+0

@raj Sieht aus, als ob Sie einen benutzerdefinierten tokenbasierten Sicherheitsfilter haben? Prüft das auf weitere Sicherheit? Müsste den Code sehen und wie das konfiguriert ist. – rhinds

+0

Ich glaube, der Code im Filter spielt hier keine Rolle. Auch nach dem Entfernen meiner benutzerdefinierten Filter passiert die Anforderung den Spring-Sicherheitsfilter-Stack, der nicht sein sollte. –

13

Wo Sie Ihre authentifizierten URL-Muster (n) zu konfigurieren? Ich sehe nur ein URI in Ihrem Code.

Haben Sie mehrere configure (HttpSecurity) Methoden oder nur eine? Es sieht so aus, als ob Sie alle Ihre URIs in der einen Methode benötigen.

Ich habe eine Website, die Authentifizierung erfordert Zugriff auf alles, damit ich/* schützen möchte. Um mich zu authentifizieren, möchte ich mich natürlich nicht schützen/einloggen. Ich habe auch statische Assets, auf die ich Zugriff gewähren möchte (damit ich die Anmeldeseite schön gestalten kann) und eine Healthcheck-Seite, die keine Authentifizierung erfordern sollte.

Zusätzlich habe ich eine Ressource,/admin, die höhere Privilegien als der Rest der Website erfordert.

Folgendes funktioniert für mich.

@Override 
protected void configure(HttpSecurity http) throws Exception { 

    http.authorizeRequests() 
     .antMatchers("/login**").permitAll() 
     .antMatchers("/healthcheck**").permitAll() 
     .antMatchers("/static/**").permitAll() 
     .antMatchers("/admin/**").access("hasRole('ROLE_ADMIN')") 
     .antMatchers("/**").access("hasRole('ROLE_USER')") 
     .and() 
      .formLogin().loginPage("/login").failureUrl("/login?error") 
       .usernameParameter("username").passwordParameter("password") 
     .and() 
      .logout().logoutSuccessUrl("/login?logout") 
     .and() 
      .exceptionHandling().accessDeniedPage("/403") 
     .and() 
      .csrf(); 

} 

HINWEIS: Dies ist eine erste Übereinstimmung gewinnt, so dass Sie möglicherweise mit der Bestellung spielen müssen. Zum Beispiel hatte ich ursprünglich/** zuerst:

 .antMatchers("/**").access("hasRole('ROLE_USER')") 
     .antMatchers("/login**").permitAll() 
     .antMatchers("/healthcheck**").permitAll() 

, die die Website verursacht ständig alle Anforderungen für/login zurück zum/login umleiten. Ebenso hatte ich/admin/** zuletzt:

 .antMatchers("/**").access("hasRole('ROLE_USER')") 
     .antMatchers("/admin/**").access("hasRole('ROLE_ADMIN')") 

die in meinem unprivledged Testbenutzer „Gast“ führte den Zugriff auf das Admin-Interface mit (! Huch)