English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Inicio de sesión de Spring Security-Ejemplo de módulo de logout

Spring Security proporciona las funcionalidades de inicio de sesión y logout que podemos usar en nuestra aplicación. Es muy útil crear aplicaciones Spring seguras.

Aquí, estamos creando una aplicación Spring MVC utilizando Spring Security y realizando la funcionalidad de inicio de sesión y logout.

Primero, creamos un proyecto Maven y proporcionamos las siguientes dependencias del proyecto en el archivo pom.xml.

Dependencias del proyecto

<proyecto xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instancia" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <versiónModelo>4.0.0</versiónModelo>
  <groupId>com.w3codebox</groupId>
  <artifactoId>springSecurityLoginOut</artifactId>
  <versión>0.0.1-SNAPSHOT</version>
  <paquete>war</packaging>
  <properties>
    <maven.compiler.target>1.8</maven.compiler.target>
    <maven.compiler.source>1.8</maven.compiler.source>
</properties>
<dependencies>
  <dependency>
            <groupId>org.springframework<//groupId>
            <artifactId>spring-webmvc<//artifactId>
            <version>5.0.2.RELEASE<//version>
        </dependency>
        <dependency>
        <groupId>org.springframework.security<//groupId>
        <artifactId>spring-security-web<//artifactId>
        <version>5.0.0.RELEASE<//version>
    </dependency>
    <dependency>
        <groupId>org.springframework.security<//groupId>
        <artifactId>spring-security-core<//artifactId>
        <version>5.0.0.RELEASE<//version>
    </dependency>
    <dependency>
        <groupId>org.springframework.security<//groupId>
        <artifactId>spring-security-config<//artifactId>
        <version>5.0.0.RELEASE<//version>
    </dependency>
    
        <!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api -->
<dependency>
    <groupId>javax.servlet<//groupId>
    <artifactId>javax.servlet-api<//artifactId>
    <version>3.1.0<//version>
    <scope>provided<//scope>
</dependency>
<dependency>
    <groupId>javax.servlet<//groupId>
    <artifactId>jstl<//artifactId>
    <version>1.2</version>
</dependency>
</dependencies>
  <build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins<//groupId>
            <artifactId>maven-war-plugin>/artifactId>
            <version>2.6</version>
            <configuration>
                <failOnMissingWebXml>false</>/failOnMissingWebXml>
            </configuration>
        </plugin>
    </plugins>
</build>
</project>

Configuración de Spring security

Desde entonces, hemos creado archivos de configuración para habilitar la función de inicio de sesión y permitir solo el acceso de usuarios autorizados.

Este proyecto contiene los siguientes cuatro archivos Java.

AppConfig.java

package com.w3codebox;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.view.InternalResourceViewResolver;
import org.springframework.web.servlet.view.JstlView;
@EnableWebMvc
@Configuration
@ComponentScan({ "com.w3codebox.controller.*" ) );
public class AppConfig {
    @Bean
    public InternalResourceViewResolver viewResolver() {
        InternalResourceViewResolver viewResolver
                          new InternalResourceViewResolver();
        viewResolver.setViewClass(JstlView.class);
        viewResolver.setPrefix("/WEB-INF/views/");
        viewResolver.setSuffix(".jsp");
        devolver viewResolver;
    }
}

MvcWebApplicationInitializer.java

package com.w3codebox;
import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;
public class MvcWebApplicationInitializer extends
        AbstractAnnotationConfigDispatcherServletInitializer {
    @Override
    protected Class<?>[] getRootConfigClasses() {
        devolver nueva Class[] { WebSecurityConfig.class };
    }
    @Override
    protected Class<?>[] getServletConfigClasses() {}}
        // TOdo Auto-metodo generado de plantilla
        return null;
    }
    @Override
    protected String[] getServletMappings() {
        return new String[] { "/"};
    }
}

SecurityWebApplicationInitializer.java

package com.w3codebox;
import org.springframework.security.web.context.*;
public class SecurityWebApplicationInitializer
    extends AbstractSecurityWebApplicationInitializer {
}

WebSecurityConfig.java

package com.w3codebox;
import org.springframework.context.annotation.*;
//import org.springframework.security.config.annotation.authentication.builders.*;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.*;
import org.springframework.security.core.userdetails.User;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.provisioning.InMemoryUserDetailsManager;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@EnableWebSecurity
@ComponentScan("com.w3codebox)
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
    
    @Bean
    public UserDetailsService userDetailsService() {
        InMemoryUserDetailsManager manager = new InMemoryUserDetailsManager();
        manager.createUser(User.withDefaultPasswordEncoder()
        .username("irfan").password("khan").roles("ADMIN").build());
        return manager;
    }
    
    @Override
    protected void configure(HttpSecurity http) throws Exception {
                
        http                            
        .authorizeRequests()
            .anyRequest().hasRole("ADMIN")
            .and().formLogin().and()
        .httpBasic()
        .and()
        .logout()
        .logoutUrl("/j_spring_security_logout)
        .logoutSuccessUrl("/")
        ;
    }
}

控制器

HomeController: 处理用户请求的控制器。

package com.w3codebox.controller;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.web.authentication.logout.SecurityContextLogoutHandler;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
@Controller
public class HomeController {
    @RequestMapping(value = "/", method = RequestMethod.GET)
    public String index() {
        return "index";
    }
    
    @RequestMapping(value="/logout", method=RequestMethod.GET)
    public String logoutPage(HttpServletRequest request, HttpServletResponse response) {
        Authentication auth = SecurityContextHolder.getContext().getAuthentication();
        if (auth != null){    
           new SecurityContextLogoutHandler().logout(request, response, auth);
        }
         return "redirect:/";
     }
}

Vista

我们有一个JSP文件 index.jsp ,其中包含以下代码。

<%@ page language="java" contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%>
    <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core">
<!DOCTYPE html public "-//W3C//DTD HTML 4.01 Transitional//EN" 
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Home</title>
</head>
<body>
<h3> Hola ${pageContext.request.userPrincipal.name}, </h3>
<h4>Bienvenido a w3codebox! </h4>
<a href="<c:url value='/salir' />Clic aquí para salir</a>
</body>
</html>

Estructura del proyecto

Después de crear los archivos mencionados anteriormente, la estructura de nuestro proyecto es como sigue:

Salida

Al ejecutarse con apache tomcat, generará la siguiente salida para el navegador.

Ahora, proporcione las credenciales del usuario para iniciar sesión.

Después de iniciar sesión con éxito, se muestra la página principal, como se describe a continuación.

Aquí, creamos un enlace de salida, que se puede usar para salir. Vamos a verificarlo y salir de la aplicación.

Se redirige de vuelta a la página de inicio de sesión.

Hemos creado con éxito una aplicación Spring MVC usando Spring Security para implementar las funciones de inicio de sesión y salida.