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

مثال على وحدة Spring Security - تسجيل الدخول-خروج

يقدم Spring Security وظائف الدخول والخروج التي يمكن استخدامها في تطبيقنا. إن إنشاء تطبيق Spring آمن مفيد للغاية.

في هذا السياق، نحن نعمل على إنشاء تطبيق Spring MVC باستخدام Spring Security، وإنجاز وظائف الدخول والخروج.

أولاً، قمنا بإنشاء مشروع Maven، وقدمنا في ملف 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>springSecurityLoginOut</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.0.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>org.springframework.security</groupId>
        <artifactId>spring-security-config</artifactId>
        <version>5.0.0.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>

تكوين Spring security

منذ ذلك الحين، قمنا بإنشاء ملف التكوين لتمكين وظيفة الدخول وتتيح الوصول فقط للمستخدمين المصرحين.

المشروع يحتوي على الملفات الـJava التالية أربعة.

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() {
        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

باقة com.w3codebox;
استورد org.springframework.security.web.context.*;
الشُّرُكُة SecurityWebApplicationInitializer
    يُمتدٍُّ من AbstractSecurityWebApplicationInitializer {
}

WebSecurityConfig.java

باقة com.w3codebox;
استورد org.springframework.context.annotation.*;
// استورد org.springframework.security.config.annotation.authentication.builders.*;
استورد org.springframework.security.config.annotation.web.builders.HttpSecurity;
استورد org.springframework.security.config.annotation.web.configuration.*;
استورد org.springframework.security.core.userdetails.User;
استورد org.springframework.security.core.userdetails.UserDetailsService;
استورد org.springframework.security.provisioning.InMemoryUserDetailsManager;
استورد org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@EnableWebSecurity
@ComponentScan("com.w3codebox")
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {}}
    
    @Bean
    public UserDetailsService userDetailsService() {
        InMemoryUserDetailsManager manager = new InMemoryUserDetailsManager();
        manager.createUser(User.withDefaultPasswordEncoder()
        .username("irfan").password("khan").roles("ADMIN").build());
        return manager;
    }
    
    @Override
    protected void configure(HttpSecurity http) throws Exception {
                
        http                            
        .authorizeRequests()
            .anyRequest().hasRole("ADMIN")
            .and().formLogin().and()
        .httpBasic()
        .and()
        .logout()
        .logoutUrl("/j_spring_security_logout")
        .logoutSuccessUrl("/")
        ;
    }
}

مستشار

HomeController: مستشار الطلبات المستخدم.

باقة com.w3codebox.controller;
استيراد javax.servlet.http.HttpServletRequest;
استيراد javax.servlet.http.HttpServletResponse;
استيراد org.springframework.security.core.Authentication;
استيراد org.springframework.security.core.context.SecurityContextHolder;
استيراد org.springframework.security.web.authentication.logout.SecurityContextLogoutHandler;
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="/logout", method=RequestMethod.GET)
    public String logoutPage(HttpServletRequest request, HttpServletResponse response) {
        Authentication auth = SecurityContextHolder.getContext().getAuthentication();
        if (auth != null) {    
           new SecurityContextLogoutHandler().logout(request, response, auth);
        }
         return "redirect:/";
     }
}

رؤية

لدينا ملف JSP index.jsp ، يحتوي على التالي من الكود.

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
    <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
DOCTYPE html public "-//W3C//DTD HTML 4.01 Transitional//EN" 
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>الصفحة الرئيسية</title>
</head>
<body>
<h3>Hello ${pageContext.request.userPrincipal.name}</h3>
<h4>مرحبًا بكم في w3codebox!</h4>
<a href="<c:url value='/logout'/>">انقر هنا للخروج</a>
</body>
</html>

بنية المشروع

بعد إنشاء الملفات المذكورة أعلاه، بنية مشروعنا ستكون كما يلي:

النتيجة

عند تشغيل apache tomcat، سيقوم بإنشاء النتيجة التالية للتصفح.

الآن، قدم معلومات تسجيل الدخول للمستخدم.

سيتم عرض الصفحة الرئيسية بعد تسجيل الدخول بنجاح، يرجى الرجوع إلى ما يلي.

في هذا المكان، قمنا بإنشاء رابط تسجيل الخروج، يمكن استخدامه للخروج. دعونا نتحقق منه ونخرج من التطبيق.

سيتم إعادة توجيه إلى صفحة تسجيل الدخول.

لقد أنشأنا بنجاح تطبيق Spring MVC باستخدام Spring Security لتحقيق وظائف تسجيل الدخول والخروج.