with example java spring spring-mvc spring-security csrf

java - spring security login example with database



Spring Security: habilita/deshabilita CSRF por tipo de cliente(navegador/no navegador) (3)

Doctora de primavera dice

"¿Cuando utiliza la protección CSRF? Nuestra recomendación es utilizar la protección CSRF para cualquier solicitud que pueda ser procesada por un navegador por usuarios normales. Si solo está creando un servicio que es usado por clientes que no son navegadores, es probable que desee desactivar Protección CSRF ".

¿Qué sucede si mi servicio va a ser utilizado tanto por clientes de "navegador" como de "no navegador", como servicios externos de terceros? ¿Spring Security ofrece una manera de desactivar csrf exclusivamente para cierto tipo de clientes?

Referencia: http://docs.spring.io/spring-security/site/docs/3.2.0.CI-SNAPSHOT/reference/html/csrf.html


En mi humilde opinión, no hay nada de eso fuera de la caja . Lo que haría en su caso, es tener una jerarquía de URL, por ejemplo, enraizada en /api que estaría exenta de csrf. Es fácil de configurar. En la configuración XML, tiene un bloque <http> normal que incluye <csrf/> , simplemente lo duplica y modifica el primer bloque así.

<http pattern="/api/**"> ... <!-- csrf --> </http>

Como es el primero, se activará para cualquier solicitud a /api hierachy sin usar csrf, y todas las demás solicitudes lo usarán.

En la parte normal de la aplicación, nunca usa la URL /api/** y las reserva para usos que no sean del navegador.

Luego, en sus controladores, los asigna tanto a su URL normal como a una copia en /api :

@Controller @RequestMapping({ "/rootcontrollerurl", "/api/rootcontrollerurl"}) class XController { @RequestMapping(value = "/request_part_url", ...) public ModelAndView method() { ... } }

(por supuesto, rootcontrollerurl y rootcontrollerurl pueden estar en blanco ...)

Pero debe analizar la implicación de seguridad de permitir solicitudes no controladas por csrf y, finalmente, excluir los controladores de la jerarquía /api .


Esto es lo que usé para deshabilitar la protección CSRF en un punto final específico en su appconfig-security.xml. Agregue un nodo con la información de su patrón como el siguiente ejemplo:

<http security="none" pattern="/sku/*"/> <http security="none" pattern="/sku/*/*"/> <http security="none" pattern="/sku"/>

Solo tenga en cuenta que el orden es importante si va a utilizar el mapa. Toda solicitud utilizando el símbolo ''*'' va primero.


Estoy seguro de que hay una forma de hacerlo en Spring Security XML, pero como estoy usando Java Config, esta es mi solución.

@Configuration @EnableWebSecurity public class SecurityConfig { @Configuration @Order(1) public static class SoapApiConfigurationAdapter extends WebSecurityConfigurerAdapter { protected void configure(HttpSecurity http) throws Exception { http .antMatcher("/soap/**") .csrf().disable() .httpBasic(); } } @Configuration public static class WebApiConfigurationAdapter extends WebSecurityConfigurerAdapter { protected void configure(HttpSecurity http) throws Exception { http .formLogin() .loginProcessingUrl("/authentication") .usernameParameter("j_username") .passwordParameter("j_password").permitAll() .and() .csrf().disable() } } }