java - not - Spring Security permitAll() no permite el acceso anónimo
spring security multiple http (3)
Tengo un método único al que quiero permitir el acceso anónimo y autenticado.
Estoy usando Spring Security 3.2.4 con una configuración basada en java.
El método de configuración anulado (en mi clase de configuración personalizada que extiende WebSecurityConfigurerAdapter) tiene el siguiente bloque http:
http
.addFilterBefore(muiltpartFilter, ChannelProcessingFilter.class)
.addFilterBefore(cf, ChannelProcessingFilter.class)
.authorizeRequests()
.anyRequest()
.authenticated()
.and()
.authorizeRequests()
.antMatchers("/ping**")
.permitAll()
.and()
.formLogin()
.loginPage("/login")
.permitAll()
.and()
.logout()
.logoutUrl("/logout")
.logoutSuccessUrl("/login");
El controlador y el método de solicitud de ping se encuentra en un controlador que también contiene el controlador de inicio de sesión y no tiene @PreAuthorize u otras anotaciones que puedan causar el problema.
El problema es que el acceso anónimo se deniega y el usuario se redirige a la página de inicio de sesión.
Al iniciar sesión en el nivel de depuración, veo los siguientes comentarios de Spring Security:
[2014-07-11 13:18:04,483] [DEBUG] [org.springframework.security.web.access.intercept.FilterSecurityInterceptor] Secure object: FilterInvocation: URL: /ping; Attributes: [authenticated]
[2014-07-11 13:18:04,483] [DEBUG] [org.springframework.security.web.access.intercept.FilterSecurityInterceptor] Previously Authenticated: org.springframework.security.authentication.AnonymousAuthenticationToken@6faad796: Principal: anonymousUser; Credentials: [PROTECTED]; Authenticated: true; Details: org.springframework.security.web.authentication.WebAuthenticationDetails@ffffa64e: RemoteIpAddress: 192.168.2.128; SessionId: 0EF6B13BBA5F00C020FF9C35A6E3FBA9; Granted Authorities: ROLE_ANONYMOUS
[2014-07-11 13:18:04,483] [DEBUG] [org.springframework.security.access.vote.AffirmativeBased] Voter: org.springframework.security.web.access.expression.WebExpressionVoter@123f2882, returned: -1
[2014-07-11 13:18:04,483] [DEBUG] [org.springframework.security.web.access.ExceptionTranslationFilter] Access is denied (user is anonymous); redirecting to authentication entry point
Lo que estoy tratando de lograr es tener un método que pueda llamarse en cualquier momento y que envíe una respuesta que indique si la solicitud está dentro o no de una sesión iniciada.
El orden de permiso es importante, funciona cuando lo configuro de esta manera:
.authorizeRequests()
.antMatchers("/ping**")
.permitAll()
.and()
.authorizeRequests()
.anyRequest()
.authenticated()
.and()
Necesidad de agregar. Anónimo ()
http
.addFilterBefore(muiltpartFilter, ChannelProcessingFilter.class)
.addFilterBefore(cf, ChannelProcessingFilter.class)
.anonymous()
.and()
.authorizeRequests()
.anyRequest()
.authenticated()
.and()
.authorizeRequests()
.antMatchers("/ping**")
.permitAll()
.and()
.formLogin()
.loginPage("/login")
.permitAll()
.and()
.logout()
.logoutUrl("/logout")
.logoutSuccessUrl("/login");
Referido de: https://.com/a/25280897/256245
Vi el mismo problema. Asegúrate de no haber llamado
super.configure(http);
anyRequest().authenticated();
Se llama por defecto.