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

تسجيل الدخول المخصص لـ Spring Security

يقدم Spring Security مودل تسجيل الدخول المدمج الخاص به للتحقق من هوية المستخدمين. ويقوم بتحقق من معلومات الاعتماد ويعطي صلاحيات الوصول إلى التطبيق.

الصفحة الخاصة بالدخول التي يقدمها هذا المodule هي مدمجة. لذلك، لا نحتاج إلى إنشاء صفحة jsp جديدة. ولكن، إذا أردنا تخصيص صفحة الدخول، كيف نفعل ذلك؟

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

انظر إلى المثال. لإنشاء مشروع Maven، قدم التفاصيل التالية.



بعد إكمالها، سيتم إنشاء بنية المشروع التالية.



تكوين الأمان

تطبيق مشاريع التكوين للتأكد من أمان Spring. يتطلب أربعة ملفات. إنشاء حزمة 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() {  
        عددًا جديدًا من الفئات [] { WebSecurityConfig.class };  
    }  
    @Override  
    protected Class<?>[] getServletConfigClasses() {  
        // TOdo Auto-generated method stub  
        عددًا صحيحًا [];  
    }  
    @Override  
    protected String[] getServletMappings() {  
        عددًا جديدًا من الأعداد الصحيحة [] { "/" };  
    }  
}

//SecurityWebApplicationInitializer.java

  باقة com.w3codebox;  
    استيراد org.springframework.security.web.context.*;  
      
    فئة public 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.*;
//استيراد org.springframework.security.core.userdetails.UserDetailsService;  
import org.springframework.security.provisioning.InMemoryUserDetailsManager;
import org.springframework.security.web.util.matcher.AntPathRequestMatcher;
import 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("khan123").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();
      .logout();
      .logoutRequestMatcher(new AntPathRequestMatcher("/logout"));
}  
}

انظر، في طريقة configure، بعد formLogin()، استخدم الطريقة loginPage("/login")، هذه هي الطريقة الفعلية التي يتم بها استدعاء صفحة الدخول المخصصة.

عرض

أولاً، قم بإنشاء صفحة الدخول الخاصة بنا. وفقًا لما يقوله مسؤولو Spring، يجب أن تكون صفحة الدخول مثل هذا.

//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>
            Invalid username and password.
        </p>
    </c:if>
    <c:if test="${param.logout != null}">       
        <p>
            You have been logged out.
        </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>
    <input type="hidden"                        
        name="${_csrf.parameterName}"
        value="${_csrf.token}"/>
    <button type="submit" class="btn">Log in</button>
</form>

//index.jsp

<html>  
<head>    
<title>صفحة المنزل</title>  
</head>  
<body>  
<h3>  Welcome to w3codebox!  <br>  </h3>
<a href="admin">Login here</a>
</body>  
</html>

//admin.jsp

<html>  
<head>  
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">  
<title>صفحة المنزل</title>  
</head>  
<body>  
نجاح الدخول!
<a href="logout">logout</a>  
</body>  
</html>

المحكم

أنشئ محكم في حزمة com.w3codebox.controller.

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

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

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

هيكل المشروع

مشروعنا كما يلي:



تشغيل الخادم

الإخراج:



الآن، قدم معلومات الاعتماد الخاصة بك للدخول.




انظروا، يعمل بشكل صحيح. الآن، يمكننا إنشاء زخرفة وأفراد أكثر تخصيصًا حسب الحاجة.