English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
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.
<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>
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:/"; } }
我们有一个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>
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.