English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
"记住我"功能使用户无需重新登录即可访问应用程序。用户的登录会话在关闭浏览器后终止,如果用户再次打开浏览器再次访问该应用程序,则会提示登录。
但是我们可以使用"记住我"功能来避免重新登录。它将用户身份存储到Cookie或数据库中,并用于标识用户。
我们正在以下示例中实现该身份。让我们看一个实例。
首先创建一个Maven项目并提供项目详细信息。
最初,项目看起来像这样:
配置项目以实现spring安全。它需要以下四个Java文件。首先创建一个包 com.w3codebox 并将所有文件放入其中。
//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
Dans cette classe, nous allons également créer des utilisateurs et gérer l'authentification. La méthode RememberMe() dans la méthode configure() est responsable de la mémorisation et du stockage des informations d'identité de l'utilisateur.
package com.w3codebox; import org.springframework.context.annotation.*; 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.provisioning.InMemoryUserDetailsManager; import org.springframework.security.web.util.matcher.AntPathRequestMatcher; @EnableWebSecurity @ComponentScan("com.w3codebox) public class WebSecurityConfig extends WebSecurityConfigurerAdapter { @Bean public UserDetailsService userDetailsService() { InMemoryUserDetailsManager manager = new InMemoryUserDetailsManager(); manager.createUser(User.withDefaultPasswordEncoder() .username("admin").password("admin123).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() .rememberMe() .key("rem-moi-clé .rememberMeParameter("remember") // c'est le nom de la case à cocher sur la page de connexion .rememberMeCookieName("rememberlogin") // c'est le nom du cookie .tokenValiditySeconds(100) // souvenir pendant un certain nombre de secondes .and() .logout() .logoutRequestMatcher(new AntPathRequestMatcher("/logout"); } }
dans com.w3codebox.controller Créez un contrôleur HomeController à l'intérieur du paquet. Veuillez consulter le code du contrôleur.
//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"; } }
Créez une vue (page JSP) pour générer la sortie vers le navigateur.
//index.jsp
<html> <head> <title>Page d'accueil</title> </head> <body> Bienvenue à w3codebox! <br> <br> <a href="admin">Connexion administrateur</a> </body> </html>
//admin.jsp
<html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Page d'accueil</title> </head> <body> Bienvenue, Admin! ? <a href="logout">logout</a> </body> </html>
//login.jsp
Ceci est notre page de connexion personnalisée, où nous avons ajouté la case à cocher "Se souvenir de moi". Voir le code.
<%@ 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> <input type="text" id="username" name="username"/> </p> <p> <label for="password">Password</label> <input type="password" id="password" name="password"/> </p> <p> <label for="remember"> Remember me</label> <input type="checkbox" name="remember" /> </p> <input type="hidden" name="${_csrf.parameterName}" value="${_csrf.token}"/> <button type="submit" class="btn">Se connecter</button> </form>
Voici notre fichier pom.xml, qui contient toutes les dépendances nécessaires.
//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>springrememberme/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> <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>
Après avoir ajouté tous les fichiers, la structure du projet est la suivante:
Sortie:
Cliquez sur le lien de connexion Admin et connectez-vous.
Voyons, nous avons Cliquez sur "Se souvenir de moi" Case à cocher.
Copier l'URL: http://localhost:8080/springrememberme/admin Et fermez complètement le navigateur. Ouvrez un deuxième navigateur et collez l'URL copiée.
Voyons, cela ne nécessite pas de connexion et nous connecte à la même page. Car nous avons effectivement coché le bouton "Se souvenir de moi" lors de la connexion.