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

Spring Security登录-注销模块示例

Spring Security提供了我们可以在应用程序中使用的登录和注销功能。创建安全的Spring应用程序很有帮助。

在这里,我们正在使用Spring Security创建一个Spring MVC应用程序,并实现登录和注销功能。

首先,我们创建了一个maven项目,并在pom.xml文件中提供了以下项目依赖项。

项目依赖项

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

Configuration de Spring security

Par la suite, nous avons créé un fichier de configuration pour activer la fonction de connexion et permettre uniquement l'accès aux utilisateurs autorisés.

Ce projet contient les quatre fichiers Java suivants.

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");
        return viewResolver;
    }
}

MvcWebApplicationInitializer.java

package com.w3codebox;
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.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("/")
        ;
    }
}

Contrôleur

HomeController: Gère les demandes d'utilisateur.

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:/";
     }
}

vue

Nous avons un fichier JSP index.jsp comprend les codes suivants.

<%@ 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> Bonjour ${pageContext.request.userPrincipal.name}, </h3>
<h4>Bienvenue à w3codebox! </h4>
<a href="<c:url value='/logout' />Cliquez ici pour vous déconnecter</a>
</body>
</html>

Structure du projet

Après la création des fichiers ci-dessus, la structure de notre projet est la suivante:

Sortie

Lorsque le runtime Apache Tomcat est utilisé, il génère le suivant pour le navigateur.

Maintenant, fournissez les informations d'identification de l'utilisateur à se connecter.

Après une connexion réussie, la page d'accueil s'affiche, voir ci-dessous.

Ici, nous créons un lien de déconnexion, utilisable pour se déconnecter. Laissons-nous vérifier et nous déconnecter de l'application.

Il redirige vers la page de connexion.

Nous avons réussi à créer une application Spring MVC en utilisant Spring Security pour implémenter les fonctionnalités de connexion et de déconnexion.