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

Funzione "ricorda me" di Spring Security

La funzione "ricorda me" permette all'utente di accedere all'applicazione senza reimpostare il login. La sessione di login termina dopo la chiusura del browser. Se l'utente riapre il browser e accede di nuovo all'applicazione, viene richiesto di effettuare il login.

Ma possiamo utilizzare la funzione "ricorda me" per evitare di reimpostare il login. Salva l'identità dell'utente nei Cookie o nel database e viene utilizzata per identificare l'utente.

Stiamo implementando questa identità negli esempi seguenti. Vediamo un esempio.

Crea un progetto Maven

Prima crea un progetto Maven e fornisci i dettagli del progetto.



All'inizio, il progetto sembra così:



Configurazione Spring Security

Configura il progetto per implementare la sicurezza Spring. È necessario i seguenti quattro file Java. Prima crea un pacchetto com.w3codebox Elenca tutti i file all'interno di esso.

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

In questo classe creeremo anche gli utenti e autenticheremo. Il metodo RememberMe() all'interno del metodo configure() è responsabile di ricordare e memorizzare l'identità dell'utente.

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-me-key")
      .rememberMeParameter("remember") // it is name of checkbox at login page
      .rememberMeCookieName("rememberlogin") // it is name of the cookie
      .tokenValiditySeconds(100) // remember for number of seconds
      .and();
      .logout();
      .logoutRequestMatcher(new AntPathRequestMatcher("/logout"));  
}  
}

controller

In com.w3codebox.controller Create a controller HomeController in the package. See the controller code.

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

Vista

Crea una vista (pagina JSP) per generare l'output nel browser.

//index.jsp

<html>  
<head>    
<title>Pagina Iniziale</title>  
</head>  
<body>  
Benvenuto su w3codebox! <br> <br>
<a href="admin">Login Admin</a>  
</body>  
</html>

//admin.jsp

<html>  
<head>  
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">  
<title>Pagina Iniziale</title>  
</head>  
<body>  
Benvenuto Admin! ?
<a href="logout">logout</a>  
</body>  
</html>

//login.jsp

Questa è la nostra pagina di login personalizzata, nella quale abbiamo aggiunto la casella di spunta "Ricordami". Visualizza il codice.

<%@ 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>
            Nome utente e password non validi.
        </p>
    </c:if>
    <c:if test="${param.logout != null}">       
        <p>
            Sei stato disconnesso.
        </p>
    </c:if>
    <p>
        <label for="username">Nome utente</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">Ricordami</label>
        <input type="checkbox" name="remember" />
    </p>
    <input type="hidden"                        
        name="${_csrf.parameterName}"
        value="${_csrf.token}"/>
    <button type="submit" class="btn">Accedi</button>
</form>

Dipendenze del progetto

Di seguito è riportato il nostro file pom.xml, che contiene tutte le dipendenze necessarie.

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

項目結構

添加所有文件後,項目結構如下所示:



運行伺服器

輸出:


 

單擊Admin登錄鏈接並登錄。



看,我們有 單擊"記住我" 複選框。



複製URL: http://localhost:8080/springrememberme/admin 並完全關閉瀏覽器。在打開第二個瀏覽器後,粘貼複製的URL。

請參考,它不會要求登錄並將我們登錄到同一頁面。因為我們在登錄時確實選中了"記住我"按鈕。