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

Connexion personnalisée Spring Security

Spring Security fournit son propre module intégré de connexion pour l'authentification des utilisateurs. Il vérifie les informations d'identification de l'utilisateur et accorde l'accès à l'application.

Le module présente une page de connexion intégrée. Par conséquent, nous n'avons pas besoin de créer une nouvelle page JSP. Mais si nous devons personnaliser la page de connexion, que devons-nous faire ?

La réponse est, nous pouvons créer notre propre page de connexion JSP et la intégrer à l'application. Dans ce sujet, nous créerons une page de connexion personnalisée et l'utiliserons pour se connecter.

Voyez l'exemple. Créez un projet Maven en fournissant les détails suivants.



Une fois terminé, il créera la structure de projet suivante.



Configuration de la sécurité

Configurez le projet pour appliquer la sécurité Spring. Il nécessite les quatre fichiers suivants. Créez un paquet com.w3codebox et mettez ces fichiers à l'intérieur.

//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.w3*" })  
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-généré stub de méthode  
        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.*;
//import org.springframework.security.core.userdetails.UserDetailsService;  
import org.springframework.security.provisioning.InMemoryUserDetailsManager;
import org.springframework.security.web.util.matcher.AntPathRequestMatcher;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;  
@EnableWebSecurity  
@ComponentScan("com.w")3codebox")  
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {}  
  
@Bean  
public UserDetailsService userDetailsService() {  
    InMemoryUserDetailsManager manager = new InMemoryUserDetailsManager();  
    manager.createUser(User.withDefaultPasswordEncoder()
    .username("irfan").password("khan123").roles("ADMIN").build());  
    return manager;  
}  
  
@Override  
protected void configure(HttpSecurity http) throws Exception {  
      
      http.authorizeRequests().
      antMatchers("/index", "/user","/").permitAll()
      .antMatchers("/admin").authenticated()
      .and()
      .formLogin()
      .loginPage("/login)
      .and()
      .logout()
      .logoutRequestMatcher(new AntPathRequestMatcher("/logout");
}  
}

Voir, dans la méthode configure, après formLogin(), utiliser la méthode loginPage("/login). C'est la méthode réelle nécessaire pour appeler la page de connexion personnalisée.

Voir

Tout d'abord, créons notre propre page de connexion. Selon les dires des officiers de Spring, la page de connexion devrait être comme suit.

//login.jsp

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<c:url value="/login" var="loginUrl"/>
<form action="${loginUrl}" method="post">       
    <c:if test="${param.error != null}">        
        p>
            Nom d'utilisateur et mot de passe non valides.
        </p>
    </c:if>
    <c:if test="${param.logout != null}">       
        p>
            Vous avez été déconnecté.
        </p>
    </c:if>
    p>
        <label for="username">Username</label>/label>
        <input type="text" id="username" name="username"/>   
    </p>
    p>
        <label for="password">Password</label>/label>
        <input type="password" id="password" name="password"/>    
    </p>
    <input type="hidden"                        
        name="${_csrf.parameterName}"
        value="${_csrf.token}"/>
    <button type="submit" class="btn">Log in</button>/button>
</form>

//index.jsp

<html>  
<head>    
<title>Home Page</title>/title>  
</head>  
<body>  
<h3> <br> Bienvenue sur w3codebox! <br> </h3>
<a href="admin">Login here</a>/a>
</body>  
</html>

//admin.jsp

<html>  
<head>  
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">  
<title>Home Page</title>/title>  
</head>  
<body>  
Login Successful!
<a href="logout">logout</a>/a>  
</body>  
</html>

contrôleur

Dans com.w3Dans le paquet codebox.controller, créer un contrôleur HomeController.

//HomeController.java

package com.w3codebox.controller;
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="/login", method=RequestMethod.GET)  
    public String login() {  
          
        return "login";  
    }  
    @RequestMapping(value="/admin", method=RequestMethod.GET)  
    public String admin() {  
          
        return "admin";  
    }  
}

Dépendances du projet

//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>springcustomlogin</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.4.RELEASE</version>
</dependency>
    !-- https://mvnrepository.com/artifact/org.springframework.security/spring-security-config -->
<dependency>
    <groupId>org.springframework.security</groupId>
    <artifactId>spring-security-config</artifactId>
    <version>5.0.4.RELEASE</version>
</dependency>
    
      
        !-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api -->  
<dependency>  
    <groupId>javax.servlet</groupId>/groupId>  
    <artifactId>javax.servlet</artifactId>-api/artifactId>  
    <version>3.1.0/version>  
    <scope>provided</scope>/scope>  
</dependency>  
<dependency>  
    <groupId>javax.servlet</groupId>/groupId>  
    <artifactId>jstl</artifactId>/artifactId>  
    <version>1.2</version>  
</dependency>  
</dependencies>  
  <build>  
    <plugins>  
        <plugin>  
            <groupId>org.apache.maven.plugins</groupId>/groupId>  
            <artifactId>maven-war-plugin>/artifactId>  
            <version>2.6</version>  
            <configuration>  
                <failOnMissingWebXml>false</failOnMissingWebXml>/failOnMissingWebXml>  
            </configuration>  
        </plugin>  
    </plugins>  
</build>  
</project>

Structure du projet

Notre projet est présenté comme suit:



Exécutez le serveur

Sortie:



Maintenant, connectez-vous en fournissant les informations d'identification de l'utilisateur.




Voyez, cela fonctionne correctement. Maintenant, nous pouvons créer des décorations plus décoratives et personnalisées selon notre besoin.