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

Spring Security "merken Sie sich"-Funktion

Die "merken Sie sich"-Funktion ermöglicht es dem Benutzer, ohne erneutes Anmelden auf die Anwendung zuzugreifen. Die Anmelde-Sitzung endet, wenn der Browser geschlossen wird. Wenn der Benutzer den Browser erneut öffnet und auf die Anwendung zugreift, wird eine Anmeldeanforderung angezeigt.

Aber wir können die "merken Sie sich"-Funktion verwenden, um das erneute Anmelden zu vermeiden. Es speichert die Identität des Benutzers in einem Cookie oder einer Datenbank und verwendet sie zur Identifizierung des Benutzers.

Wir implementieren diese Identität im folgenden Beispiel. Lassen Sie uns ein Beispiel betrachten.

Erstellen Sie ein Maven-Projekt

Erstellen Sie zunächst ein Maven-Projekt und geben Sie die Projektinformationen an.



Am Anfang sah das Projekt so aus:



Spring Security-Konfiguration

Konfigurieren Sie das Projekt, um Spring Security zu implementieren. Es werden folgende vier Java-Dateien benötigt. Zunächst erstellen Sie ein Paket com.w3codebox und alle Dateien darin ablegen.

//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-generierter Methodenstub  
        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 diesem Klassensatz erstellen wir auch Benutzer und authentifizieren sie. Die Methode RememberMe() im configure()-Methodenbereich ist verantwortlich für das Speichern und Erinnern der Benutzeridentität.

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  
geschützt 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") // es ist der Name des Kontrollkästchens auf der Login-Seite
      .rememberMeCookieName("rememberlogin") // es ist der Name des Cookies
      .tokenValiditySeconds(100) // for number of seconds
      .and()
      .logout()
      .logoutRequestMatcher(new AntPathRequestMatcher("/logout");  
}  
}

Controller

im com.w3codebox.controller Eine Controller-Klasse HomeController wurde im Paket erstellt. Bitte sehen Sie sich den Controller-Code an.

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

Ansicht

Erstelle eine Ansicht (JSP-Seite), um die Ausgabe in den Browser zu senden.

//index.jsp

<html>  
<head>    
<title>Startseite</title>  
</head>  
<body>  
Willkommen in der3codebox! <br> <br>
<a href="admin">Admin-Anmeldung</a>  
</body>  
</html>

//admin.jsp

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

//login.jsp

Dies ist unsere benutzerdefinierte Login-Seite, in der wir das Kontrollkästchen "Erinnere mich an mich" hinzugefügt haben. Code anzeigen.

<%@ 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>
            Ungültiger Benutzername und Passwort.
        </p>
    </c:if>
    <c:if test="${param.logout != null}">       
        <p>
            Du wurdest abgemeldet.
        </p>
    </c:if>
    <p>
        <label for="username">Benutzername</label>
        <input type="text" id="username" name="username"/>   
    </p>
    <p>
        <label for="password">Passwort</label>
        <input type="password" id="password" name="password"/>    
    </p>
    <p>
        <label for="remember">Erinnere mich an mich</label>
        <input type="checkbox" name="remember" />
    </p>
    <input type="hidden"                        
        name="${_csrf.parameterName}"
        value="${_csrf.token}"/>
    <button type="submit" class="btn">Anmelden</button>/button>
</form>

Projektabhängigkeiten

Hier ist unsere pom.xml-Datei, die alle erforderlichen Abhängigkeiten enthält.

//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.w</groupId>3codebox/groupId>
  <artifactId>springrememberme</artifactId>/artifactId>
  <version>0.0.1-SNAPSHOT/version>
  <packaging>war</packaging>/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>/groupId>  
            <artifactId>spring</artifactId>-webmvc/artifactId>  
            <version>5.0.2.RELEASE</version>  
        </dependency>  
        <dependency>  
        <groupId>org.springframework.security</groupId>/groupId>  
        <artifactId>spring</artifactId>-security-web/artifactId>  
        <version>5.0.0.RELEASE/version>  
    </dependency>  
<dependency>
    <groupId>org.springframework.security</groupId>/groupId>
    <artifactId>spring</artifactId>-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>/groupId>
    <artifactId>spring</artifactId>-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>  
</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>

Projektstruktur

Nachdem alle Dateien hinzugefügt wurden, sieht die Projektstruktur wie folgt aus:



Server starten

Ausgabe:


 

Klicken Sie auf den Admin-Anmeldeverweis und melden Sie sich an.



Siehe, wir haben Klicken Sie auf "Merken Sie mich" Kontrollkästchen.



URL kopieren: http://localhost:8080/springrememberme/admin Und schließen Sie den Browser vollständig. Nachdem Sie den zweiten Browser geöffnet haben, fügen Sie die kopierte URL ein.

Siehe, es wird nicht angefordert, sich anzumelden, und wir werden auf die gleiche Seite angemeldet. Denn wir haben tatsächlich beim Anmelden den "Merken Sie mich"-Knopf ausgewählt.