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

Spring Security记住我功能

"记住我"功能使用户无需重新登录即可访问应用程序。用户的登录会话在关闭浏览器后终止,如果用户再次打开浏览器再次访问该应用程序,则会提示登录。

但是我们可以使用"记住我"功能来避免重新登录。它将用户的身份存储到Cookie或数据库中,并用于标识用户。

我们正在以下示例中实现该身份。让我们看一个实例。

创建Maven项目

首先创建一个Maven项目并提供项目详细信息。



最初,项目看起来像这样:



Spring Security配置

配置项目以实现spring安全。它需要以下四个Java文件。首先创建一个包 com.w3codebox 并将所有文件放入其中。

//AppConfig.java

باقة 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

باقة com.w3codebox;  
import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;  
public class MvcWebApplicationInitializer extends  
        AbstractAnnotationConfigDispatcherServletInitializer {  
    @Override  
    protected Class<?>[] getRootConfigClasses() {  
        العودة الجديدة Class[] { WebSecurityConfig.class };  
    }  
    @Override  
    محمية Class<?>[] getServletConfigClasses() {  
        // TOdo Auto-generated method stub  
        العودة null;  
    }  
    @Override  
    محمية String[] getServletMappings() {  
        العودة الجديدة String[] { "/" };  
    }  
}

//SecurityWebApplicationInitializer.java

باقة com.w3codebox;  
استيراد org.springframework.security.web.context.*;        
    كلاس public SecurityWebApplicationInitializer  
        توسيع AbstractSecurityWebApplicationInitializer {  
    }

//WebSecurityConfig.java

في هذا الكائن، سنقوم أيضًا بإنشاء مستخدمين وإجراء التحقق من الهوية. يتم تكليف طريقة RememberMe() داخل طريقة configure() بتذكر وتخزين هوية المستخدم.

باقة com.w3codebox;
استيراد org.springframework.context.annotation.*;    
استيراد org.springframework.security.config.annotation.web.builders.HttpSecurity;  
استيراد org.springframework.security.config.annotation.web.configuration.*;  
استيراد org.springframework.security.core.userdetails.*;  
استيراد org.springframework.security.provisioning.InMemoryUserDetailsManager;
استيراد 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") // هو اسم المربع المزدوج في صفحة الدخول
      .rememberMeCookieName("rememberlogin") // هو اسم الكوكي
      .tokenValiditySeconds(100) // تذكر لعدد من الثواني
      .and();
      .logout();
      .logoutRequestMatcher(new AntPathRequestMatcher("/logout"));  
}  
}

مدير التحكم

في com.w3codebox.controller في الداخل إنشاء مدير التحكم 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";
    }
}

عرض

أنشئ عرض (صفحة JSP) لتحويل الناتج إلى المتصفح.

//index.jsp

<html>  
<head>    
<title>صفحة البداية</title>  
</head>  
<body>  
مرحبًا بك في w3codebox! <br> <br>
<a href="admin">دخول Admin</a>  
</body>  
</html>

//admin.jsp

<html>  
<head>  
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">  
<title>صفحة البداية</title>  
</head>  
<body>  
مرحبًا Admin! ?
<a href="logout">logout</a>  
</body>  
</html>

//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>
            اسم المستخدم وكلمة المرور غير صحيحين.
        </p>
    </c:if>
    <c:if test="${param.logout != null}">       
        <p>
            تم تسجيل خروجك.
        </p>
    </c:if>
    <p>
        <label for="username">اسم المستخدم</label>
        <input type="text" id="username" name="username"/>   
    </p>
    <p>
        <label for="password">كلمة المرور</label>
        <input type="password" id="password" name="password"/>    
    </p>
    <p>
        <label for="remember"> تذكرني</label>
        <input type="checkbox" name="remember" />
    </p>
    <input type="hidden"                        
        name="${_csrf.parameterName}"
        value="${_csrf.token}"/>
    <button type="submit" class="btn">Log in</button>
</form>

اعتمادات المشروع

هذا هو ملف pom.xml الخاص بنا، الذي يحتوي على جميع الإعتمادات المطلوبة.

//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 الم剪ن.

انظر، لن يطلب منك تسجيل الدخول وسنقوم بتسجيل الدخول إلى نفس الصفحة. لأننا في الواقع اخترنا زر "تذكرني" عند تسجيل الدخول.