Inicio de sesión del formulario de seguridad de Spring

1. Introducción

Este artículo se centrará en Iniciar sesión con Spring Security . Vamos a construir sobre el simple ejemplo anterior de Spring MVC, ya que es una parte necesaria de la configuración de la aplicación web junto con el mecanismo de inicio de sesión.

2. Las dependencias de Maven

Al trabajar con Spring Boot, el arrancador spring-boot-starter-security incluirá automáticamente todas las dependencias como spring-security-core , spring-security-web y spring-security-config, entre otras:

 org.springframework.boot spring-boot-starter-security 2.3.3.RELEASE 

En caso de que no usemos Spring Boot, consulte el artículo Spring Security con Maven, que describe cómo agregar todas las dependencias requeridas. Se requerirán tanto spring-security-web como spring-security-config estándar .

3. Configuración de Spring Security Java

Comencemos creando una clase de configuración de Spring Security que amplíe WebSecurityConfigurerAdapter.

Al agregar @EnableWebSecurity , obtenemos soporte de integración de Spring Security y MVC:

@Configuration @EnableWebSecurity public class SecSecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(final AuthenticationManagerBuilder auth) throws Exception { // authentication manager (see below) } @Override protected void configure(final HttpSecurity http) throws Exception { // http builder configurations for authorize requests and form login (see below) } }

En este ejemplo, usamos autenticación en memoria y definimos 3 usuarios.

A continuación, revisamos los elementos que hemos utilizado para crear la configuración de inicio de sesión del formulario.

Primero construyamos nuestro Administrador de autenticación.

3.1. Administrador de autenticación

El proveedor de autenticación está respaldado por una implementación simple en memoria, específicamente InMemoryUserDetailsManager . Esto es útil para la creación rápida de prototipos cuando aún no es necesario un mecanismo de persistencia completo:

protected void configure(final AuthenticationManagerBuilder auth) throws Exception { auth.inMemoryAuthentication() .withUser("user1").password(passwordEncoder().encode("user1Pass")).roles("USER") .and() .withUser("user2").password(passwordEncoder().encode("user2Pass")).roles("USER") .and() .withUser("admin").password(passwordEncoder().encode("adminPass")).roles("ADMIN"); }

Aquí, configuramos tres usuarios con el nombre de usuario, la contraseña y el rol codificados.

Comenzando con Spring 5, también tenemos que definir un codificador de contraseña . En nuestro ejemplo, usamos BCryptPasswordEncoder:

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

A continuación, configuremos HttpSecurity.

3.2. Configuración para autorizar solicitudes

Comenzamos haciendo las configuraciones necesarias para Autorizar Solicitudes.

Aquí, permitimos el acceso anónimo en / login para que los usuarios puedan autenticarse. Restringir / admin a roles ADMIN y asegurar todo lo demás:

@Override protected void configure(final HttpSecurity http) throws Exception { http .csrf().disable() .authorizeRequests() .antMatchers("/admin/**").hasRole("ADMIN") .antMatchers("/anonymous*").anonymous() .antMatchers("/login*").permitAll() .anyRequest().authenticated() .and() // ... }

Tenga en cuenta que el orden de los elementos antMatchers () es significativo: las reglas más específicas deben ir primero, seguidas de las más generales .

3.3. Configuración para el formulario de inicio de sesión

A continuación, ampliamos la configuración anterior para el inicio y cierre de sesión del formulario:

@Override protected void configure(final HttpSecurity http) throws Exception { http // ... .and() .formLogin() .loginPage("/login.html") .loginProcessingUrl("/perform_login") .defaultSuccessUrl("/homepage.html", true) .failureUrl("/login.html?error=true") .failureHandler(authenticationFailureHandler()) .and() .logout() .logoutUrl("/perform_logout") .deleteCookies("JSESSIONID") .logoutSuccessHandler(logoutSuccessHandler()); }
  • loginPage () - la página de inicio de sesión personalizada
  • loginProcessingUrl () : la URL a la que enviar el nombre de usuario y la contraseña
  • defaultSuccessUrl () : la página de destino después de un inicio de sesión exitoso
  • failureUrl () : la página de destino después de un inicio de sesión fallido
  • logoutUrl () - el cierre de sesión personalizado

4. Agregue Spring Security a la aplicación web

Para usar la configuración de Spring Security definida anteriormente, debemos adjuntarla a la aplicación web.

Usaremos WebApplicationInitializer , por lo que no necesitamos proporcionar ningún archivo web.xml:

public class AppInitializer implements WebApplicationInitializer { @Override public void onStartup(ServletContext sc) { AnnotationConfigWebApplicationContext root = new AnnotationConfigWebApplicationContext(); root.register(SecSecurityConfig.class); sc.addListener(new ContextLoaderListener(root)); sc.addFilter("securityFilter", new DelegatingFilterProxy("springSecurityFilterChain")) .addMappingForUrlPatterns(null, false, "/*"); } }

Tenga en cuenta que este inicializador no es necesario si usamos una aplicación Spring Boot. Eche un vistazo a nuestro artículo sobre la configuración automática de seguridad de Spring Boot para obtener más detalles sobre cómo se carga la configuración de seguridad en Spring Boot.

5. La configuración XML de Spring Security

También echemos un vistazo a la configuración XML correspondiente.

El proyecto en su conjunto está utilizando la configuración de Java, por lo que necesitamos para importar el archivo de configuración XML a través de una aplicación Java @Configuration clase:

@Configuration @ImportResource({ "classpath:webSecurityConfig.xml" }) public class SecSecurityConfig { public SecSecurityConfig() { super(); } }

Y la configuración XML de Spring Security - webSecurityConfig.xml :

6. El web.xml

Antes de la introducción de Spring 4 , solíamos configurar la configuración de Spring Security en web.xml , solo un filtro adicional agregado al Spring MVC web.xml estándar :

Spring Secured Application     springSecurityFilterChain org.springframework.web.filter.DelegatingFilterProxy   springSecurityFilterChain /* 

El filtro, DelegatingFilterProxy , simplemente delega en un bean administrado por Spring, el FilterChainProxy , que a su vez puede beneficiarse de la gestión completa del ciclo de vida del bean Spring y demás .

7. El formulario de inicio de sesión

La página del formulario de inicio de sesión se registrará con Spring MVC utilizando el mecanismo sencillo para asignar los nombres de las vistas a las URL sin necesidad de un controlador explícito entre ellos:

registry.addViewController("/login.html");

This, of course, corresponds to the login.jsp:


    
User:
Password:

The Spring Login form has the following relevant artifacts:

  • login – the URL where the form is POSTed to trigger the authentication process
  • username – the username
  • password – the password

8. Further Configuring Spring Login

We briefly discussed a few configurations of the login mechanism when we introduced the Spring Security Configuration above – let's go into some detail now.

One reason to override most of the defaults in Spring Security is to hide the fact that the application is secured with Spring Security and minimize the information a potential attacker knows about the application.

Fully configured, the login element looks like this:

@Override protected void configure(HttpSecurity http) throws Exception { http.formLogin() .loginPage("/login.html") .loginProcessingUrl("/perform_login") .defaultSuccessUrl("/homepage.html",true) .failureUrl("/login.html?error=true") }

Or the corresponding XML configuration:

8.1. The Login Page

Next, let's see how we can configure a custom login page using the loginPage() method:

http.formLogin() .loginPage("/login.html")

Or, via XML configuration:

login-page='/login.html'

If we don't specify this, Spring Security will generate a very basic Login Form at the /login URL.

8.2. The POST URL for Login

The default URL where the Spring Login will POST to trigger the authentication process is /login which used to be /j_spring_security_check before Spring Security 4.

We can use the loginProcessingUrl method to override this URL:

http.formLogin() .loginProcessingUrl("/perform_login")

Or, via XML configuration:

login-processing-url="/perform_login"

A good reason to override this default URL is to hide the fact that the application is actually secured with Spring Security – that information should not be available externally.

8.3. The Landing Page on Success

After a successful login process, the user is redirected to a page – which by default is the root of the web application.

We can override this via the defaultSuccessUrl() method:

http.formLogin() .defaultSuccessUrl("/homepage.html")

Or with XML configuration:

default-target-url="/homepage.html"

In case the always-use-default-target is set to true, then the user is always redirected to this page. If that attribute is set to false, then the user will be redirected to the previous page they wanted to visit before being prompted to authenticate.

8.4. The Landing Page on Failure

Same as with the Login Page, the Login Failure Page is autogenerated by Spring Security at /login?error by default.

To override this, we can use the failureUrl() method:

http.formLogin() .failureUrl("/login.html?error=true")

Or with XML:

authentication-failure-url="/login.html?error=true"

9. Conclusion

En este Ejemplo de inicio de sesión de Spring , configuramos un proceso de autenticación simple: discutimos el Formulario de inicio de sesión de Spring Security, la Configuración de seguridad y algunas de las personalizaciones más avanzadas disponibles.

La implementación de este tutorial de Spring Login se puede encontrar en el proyecto GitHub; este es un proyecto basado en Eclipse, por lo que debería ser fácil de importar y ejecutar tal como está.

Cuando el proyecto se ejecuta localmente, se puede acceder al HTML de muestra en:

//localhost:8080/spring-security-mvc-login/login.html