English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Spring Security bietet uns die Login- und Logout-Funktionen, die wir in der Anwendung verwenden können. Es ist sehr hilfreich, eine sichere Spring-Anwendung zu erstellen.
Hier verwenden wir Spring Security, um eine Spring MVC-Anwendung zu erstellen und die Login- und Logout-Funktionen zu implementieren.
Zunächst haben wir ein Maven-Projekt erstellt und die folgenden Projektabhängigkeiten im pom.xml-Dokument bereitgestellt.
<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 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.w3codebox</groupId> <artifactId>springSecurityLoginOut</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>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>
此后,我们创建了配置文件以启用登录功能并仅允许授权用户访问。
该项目包含以下四个Java文件。
AppConfig.java
package com.w;3codebox; 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"); return viewResolver; } }
MvcWebApplicationInitializer.java
package com.w;3codebox; import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer; public class MvcWebApplicationInitializer extends AbstractAnnotationConfigDispatcherServletInitializer { @Override protected Class<?>[] getRootConfigClasses() { return new Class[] { WebSecurityConfig.class }; } @Override protected Class<?>[] getServletConfigClasses() {}} // TOdo Auto-generated method stub return null; } @Override protected String[] getServletMappings() { return new String[] { "/"}; } }
SecurityWebApplicationInitializer.java
package com.w;3codebox; import org.springframework.security.web.context.*; public class SecurityWebApplicationInitializer extends AbstractSecurityWebApplicationInitializer { }
WebSecurityConfig.java
package com.w;3codebox; 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.w;3codebox.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 过渡//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> Hallo ${pageContext.request.userPrincipal.name}, </h3> <h4>Willkommen bei w3codebox! </h4> <a href="<c:url value='/logout' />Klicken Sie hier, um auszologgen</a> </body> </html>
Nachdem die obigen Dateien erstellt wurden, sieht die Projektstruktur wie folgt aus:
Ausgabe
Bei der Verwendung von Apache Tomcat als Laufzeitumgebung generiert es die folgenden Ausgaben für den Browser.
Geben Sie nun die Anmeldeinformationen des Benutzers ein.
Nach dem erfolgreichen Login wird die Startseite angezeigt, siehe unten.
Hier erstellen wir einen Abmelde-Link, der zum Abmelden verwendet werden kann. Lassen Sie uns überprüfen und aus der Anwendung abmelden.
Es leitet zurück zur Anmeldeseite.
Wir haben erfolgreich eine SpringMVC-Anwendung erstellt, die mit Spring Security die Anmelde- und Abmeldefunktionen implementiert.