Introducción a Java Config para Spring Security

1. Información general

Este artículo es una introducción a la configuración de Java para Spring Security que permite a los usuarios configurar Spring Security fácilmente sin el uso de XML .

La configuración de Java se agregó al marco de Spring en Spring 3.1 y se extendió a Spring Security en Spring 3.2 y se define en una clase anotada @Configuration .

2. Configuración de Maven

Para usar Spring Security en proyectos de Maven, primero necesitamos tener la dependencia spring-security-core en el proyecto pom.xml :

 org.springframework.security spring-security-core 5.3.3.RELEASE 

La última versión siempre se puede encontrar aquí.

3. Seguridad web con configuración Java

Comencemos con un ejemplo básico de una configuración de Spring Security Java:

@EnableWebSecurity public class SecurityConfig extends WebSecurityConfigurerAdapter { @Autowired public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception { auth.inMemoryAuthentication().withUser("user") .password(passwordEncoder().encode("password")).roles("USER"); } }

Como habrá notado, la configuración establece una configuración básica de autenticación en memoria. Además, a partir de Spring 5, necesitamos un bean PasswordEncoder :

@Bean public PasswordEncoder passwordEncoder() { return new BCryptPasswordEncoder(); }

4. Seguridad HTTP

Para habilitar la seguridad HTTP en Spring, necesitamos extender WebSecurityConfigurerAdapter para proporcionar una configuración predeterminada en el método configure (HttpSecurity http) :

protected void configure(HttpSecurity http) throws Exception { http.authorizeRequests() .anyRequest().authenticated() .and().httpBasic(); } 

La configuración predeterminada anterior garantiza que cualquier solicitud a la aplicación se autentique con un inicio de sesión basado en formulario o autenticación básica HTTP.

Además, es exactamente similar a la siguiente configuración XML:

5. Formulario de inicio de sesión

Curiosamente, Spring Security genera una página de inicio de sesión automáticamente, en función de las funciones que están habilitadas y utilizando valores estándar para la URL que procesa el inicio de sesión enviado:

protected void configure(HttpSecurity http) throws Exception { http.authorizeRequests() .anyRequest().authenticated() .and().formLogin() .loginPage("/login").permitAll(); }

Aquí la página de inicio de sesión generada automáticamente es conveniente para comenzar a trabajar rápidamente.

6. Autorización con roles

Configuremos ahora una autorización simple en cada URL usando roles:

protected void configure(HttpSecurity http) throws Exception { http.authorizeRequests() .antMatchers("/", "/home").access("hasRole('USER')") .antMatchers("/admin/**").hasRole("ADMIN") .and() // some more method calls .formLogin(); }

Observe cómo estamos usando tanto la API de tipo seguro, hasRole , como la API basada en expresiones, a través del acceso.

7. Cerrar sesión

Como muchos otros aspectos de Spring Security, el cierre de sesión tiene algunos valores predeterminados excelentes proporcionados por el marco.

De forma predeterminada, una solicitud de cierre de sesión invalida la sesión, borra cualquier caché de autenticación, borra SecurityContextHolder y redirige a la página de inicio de sesión.

Aquí hay una configuración de cierre de sesión simple:

protected void configure(HttpSecurity http) throws Exception { http.logout(); }

Sin embargo, si desea tener más control sobre los controladores disponibles, así es como se verá una implementación más completa:

protected void configure(HttpSecurity http) throws Exception { http.logout().logoutUrl("/my/logout") .logoutSuccessUrl("/my/index") .logoutSuccessHandler(logoutSuccessHandler) .invalidateHttpSession(true) .addLogoutHandler(logoutHandler) .deleteCookies(cookieNamesToClear) .and() // some other method calls }

8. Autenticación

Echemos un vistazo a otra forma de permitir la autenticación con Spring Security.

8.1. Autenticación en memoria

Comenzaremos con una configuración simple en memoria:

@Autowired public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception { auth.inMemoryAuthentication() .withUser("user").password(passwordEncoder().encode("password")).roles("USER") .and() .withUser("admin").password(passwordEncoder().encode("password")).roles("USER", "ADMIN"); } 

8.2. Autenticación JDBC

Para mover eso a JDBC, todo lo que tiene que hacer es definir una fuente de datos dentro de la aplicación y usarla directamente:

@Autowired private DataSource dataSource; @Autowired public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception { auth.jdbcAuthentication().dataSource(dataSource) .withDefaultSchema() .withUser("user").password(passwordEncoder().encode("password")).roles("USER") .and() .withUser("admin").password(passwordEncoder().encode("password")).roles("USER", "ADMIN"); } 

Por supuesto, con los dos ejemplos anteriores, también necesitamos definir el bean PasswordEncoder como se describe en la Sección 3.

9. Conclusión

En este tutorial rápido, repasamos los conceptos básicos de la configuración de Java para Spring Security y nos enfocamos en los ejemplos de código que ilustran los escenarios de configuración más simples.