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

Spring Security Login-Beispielmodul für Abmeldung

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.

Projekt-Abhängigkeiten

<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>

Spring security配置

此后,我们创建了配置文件以启用登录功能并仅允许授权用户访问。

该项目包含以下四个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>

Projektstruktur

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.