Spring: autenticación basada en formularios de seguridad

Prerrequisitos:  Introducción a la primavera , bota de primavera

Spring Security es un poderoso marco de seguridad que proporciona autenticación y autorización a la aplicación. Es el estándar de facto para proteger las aplicaciones basadas en Spring y utiliza filtros de servlet para proporcionar autenticación y autorización para las aplicaciones. Se puede ampliar para admitir los requisitos de su aplicación. Brinda protección contra ataques como fijación de sesión, secuestro de clics, capacidad para proteger aplicaciones contra ataques de fuerza bruta. En este artículo, aprenderá cómo combinar una página de inicio de sesión personalizada con Spring Security y cómo Spring maneja la autenticación basada en formularios .

Pasos para crear un formulario de inicio de sesión personalizado con Spring Security

En primer lugar, cree un proyecto de arranque de primavera con Spring Initializr, proporcione un grupo y un Id. de artefacto, elija la versión de arranque de primavera, agregue Spring Web, Spring Security y Thymeleaf como dependencias.

Esto creará un proyecto de inicio Spring Boot con un archivo de configuración pom.xml, la estructura del proyecto se vería así:

El pom.xml define la configuración de las dependencias del proyecto, no necesitamos agregar otras dependencias en este momento ya que estamos usando Spring Boot y la mayoría de las cosas que necesitamos para este proyecto se configuran automáticamente.

XML

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
                        https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.6.3</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.gfg</groupId>
    <artifactId>SpringSecurityLoginForm</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>SpringSecurityLoginForm</name>
    <description>Demo project for Spring Boot</description>
    <properties>
        <java.version>1.8</java.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-security</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.security</groupId>
            <artifactId>spring-security-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>
  
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
  
</project>

La clase de controlador maneja la lógica relacionada con el negocio, maneja las requests provenientes del cliente (en este caso, el navegador) y las redirige a la página de visualización. La clase LoginController en com.gfg.SpringSecurityLoginForm se invoca usando @ Controller , tiene dos métodos GET para dos requests. El método de bienvenida simplemente redirige a la página de bienvenida y el método de inicio de sesión redirige a la página de inicio de sesión personalizada.

Java

package com.gfg.SpringSecurityLoginForm.controller;
  
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
  
@Controller
public class LoginController {
      
    @GetMapping("/welcome")
    public String welcome() {
        return "welcome.html";
          
    }
      
    @GetMapping("/login")
    public String login() {
        return "login.html";
          
    }
}

La página login.html en la carpeta de plantillas define una página de inicio de sesión personalizada con campos como nombre de usuario y contraseña. El formulario envía un método de publicación después del envío que envía los datos de entrada del usuario a la configuración de Spring. La dependencia de Theymleaf ayuda a representar la página de inicio de sesión.

HTML

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
    <h1>Login page</h1>
    <form th:action="@{/login}" method="post">
        <div><label>Username: </label><input type="text" name="username"></div>
        <div><label>Password: </label><input type="password" name="password"></div>
        <div><button name="submit" type="submit" >Login</button></div>
    </form>
</body>
</html>

La página welcome.html en la carpeta de plantillas es un archivo HTML simple que muestra un mensaje de inicio de sesión exitoso y proporciona un enlace para cerrar sesión en la aplicación.

HTML

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
    <h1>LoggedIn Successful</h1>
    <h2>Welcome Back Click here to <a href="logout">logout</a></h2>
</body>
</html>

Cuando ejecuta su aplicación por primera vez sin ninguna configuración personalizada, Spring Security proporciona una contraseña generada por el sistema en la consola que se parece a esto:

Este formulario es de facto para la seguridad de primavera, formLogin() en la clase HttpSecurity es responsable de presentar el formulario de inicio de sesión y validar las credenciales del usuario. Spring Security utiliza un filtro de servlet que intercepta todas las requests entrantes y las redirige a esta página de inicio de sesión. El servidor valida las credenciales pasadas por el usuario y proporciona un token para esa sesión en particular. El ID de usuario es » usuario » de forma predeterminada y se proporciona una contraseña generada por el usuario en la consola.

Aquí es donde la magia de Spring Security entra en escena, la clase SpringSecurityConfig en el paquete com.gfg.config extiende la clase WebSecurityConfigureAdapter que es responsable de configurar la solicitud entrante. Los métodos de configuración proporcionan una string de métodos para configurar, validar y asignar roles al usuario. El método AuthorizeRequest() inicia la string de métodos, y anyRequest () define que cualquier solicitud entrante tendrá que pasar por la configuración de seguridad de Spring. El formLogin() básicamente le dice a Spring qué tipo de configuración de inicio de sesión queremos. En este caso, queremos hacer un inicio de sesión basado en un formulario. PermitAll ()El método permite que cualquier usuario de cualquier rol tenga acceso a una página o formulario en particular. La página de inicio de sesión («/ inicio de sesión») básicamente le dice a Spring que use nuestra página de inicio de sesión personalizada que creamos en lugar de la página predeterminada. El parámetro de nombre de usuario obtiene los datos pasados ​​en el campo de nombre de usuario de la página de inicio de sesión. El logout() cierra la sesión de la página para esa sesión.

Java

package com.gfg.SpringSecurityLoginForm.config;
  
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.web.util.matcher.AntPathRequestMatcher;
  
@EnableWebSecurity
public class SpringSecurityConfig extends WebSecurityConfigurerAdapter {
      
    @Override
    protected void configure(HttpSecurity http) throws Exception {
          
        http.authorizeRequests().anyRequest().authenticated().and()
          .formLogin().permitAll().loginPage("/login")
                .usernameParameter("username").and().logout()
          .logoutRequestMatcher(new AntPathRequestMatcher("/logout")).permitAll();
          
    }
}

También podemos definir nuestro nombre de usuario y contraseña personalizados en lugar de la contraseña generada por el sistema. Puede definir la identificación y la contraseña del cliente mediante el método de una propiedad de seguridad de resorte en los archivos application.properties en la carpeta de recursos. Mencione el nombre de usuario y la contraseña en lugar de usuario y pase respectivamente.

spring.security.user.name=usuario

spring.security.user.password=contraseña

Después de agregar todos los archivos de configuración y las clases, la estructura de su proyecto debería verse así:

Ahora es el momento de ejecutar su proyecto creado, ejecute su programa como una aplicación Java e ingrese la URL http://localhost:8080/welcome en su navegador favorito. Escriba usuario y pase como nombre de usuario y contraseña respectivamente.

Después de una autenticación exitosa, Spring redirigirá automáticamente a la página de bienvenida.

Por lo tanto, hemos creado una autenticación basada en formularios personalizada muy básica utilizando Spring Security y la hemos probado localmente.

Publicación traducida automáticamente

Artículo escrito por ashutosh44 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *