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

مكتبة علامات Spring Security JSP

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

تستخدم هذه العلامات لحماية طبقة العرض للتطبيق.

علامة الترخيص علامة التحقق من الهوية علامة Accesscontrollist Csrfinput علامة علامة CsrfMetaTags

علامة الترخيص

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

استخدم هذا العلامة اثنين من الخاصيات access و عنوان URL لتحقق من الترخيص للطلب. يمكننا تقييم هذا العلامة من خلال دور المستخدم.

فقط عندما تكون الخاصية مستوفيًا، سيتم عرض المحتوى داخل هذا العلامة. على سبيل المثال.

<sec:authorize access="hasRole('ADMIN')">
سيقوم بعرض المستخدم فقط إذا كان مديرًا
</sec:authorize>

علامة التحقق من الهوية

هذا العلامة يستخدم لوصول إلى الهوية المصرح بها في سياق الأمان. إذا كان Authentication هو مثيل لـ UserDetails، فيمكن استخدامه للحصول على تفاصيل المستخدم الحالي. على سبيل المثال.

<sec:authentication property="principal.username">

علامة Accesscontrollist

يستخدم هذا العلامة مع وحدة Spring Security ACL. إنه يتحقق من قائمة الأذونات المطلوبة للمجال المحدد. سيتم تنفيذ العلامة فقط إذا كان المستخدم الحالي يمتلك جميع الأذونات. على سبيل المثال.

<sec:accesscontrollist hasPermission="1,2" domainObject="${someObject}">
 إذا كان المستخدم يمتلك جميع الأذونات الممثلة بالقيم "1" أو "2" على العنصر المحدد.
</sec:accesscontrollist>

علامة CsrfInput

استخدم هذه العلامة لإنشاء CSRF token في نماذج HTML. تأكد من تم تمكين حماية CSRF قبل استخدامها. يجب أن نضع هذه العلامة في   لإنشاء CSRF token داخل العلامة. على سبيل المثال.

<form method="post" action="/some/action">
                <sec:csrfInput />
                الاسم:<br />
                <input type="text" name="username" />
                ...
        </form>

علامة CsrfMetaTags

إنها تضيف علامة meta تحتوي على بيانات CSRF token، وحقول النموذج، وأسماء الرؤوس، وقيمة CSRF token. هذه القيم مفيدة جدًا في إعداد CSRF token في JavaScript في التطبيق.

يجب أن تكون العلامة في داخل علامات HTML.

JAR Spring Security Taglib

لتنفيذ أي من هذه العلامات، يجب أن نكون لدينا jar ملف spring security taglib في التطبيق. يمكن أيضًا إضافة هذا الاعتماد Maven التالي.

</dependency>
    <groupId>org.springframework.security</groupId>
    <artifactId>spring-security-taglibs</artifactId>
    <version>5.0.4.RELEASE</version>
</dependency>

بيانات Spring Security Taglib

في صفحة JSP، يمكننا استخدام البيانات التالية لاستخدام taglib.

<%@ taglib prefix="sec" uri="http://www.springframework.org/security/tags" %>

الآن، دعونا نرى مثالاً على تنفيذ هذه العلامات في مشروع Maven Spring Security.

نحن نستخدم STS (Spring Tools Suite) لإنشاء المشاريع. انظر إلى المثال.

إنشاء المشروع





انقر إتمام > زر، سيقوم بإنشاء مشروع Maven كما يلي:



إعداد Spring Security

لإعداد Spring Security في تطبيق Spring MVC، يرجى وضع الملفات التالية في في 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;  
    }  
}

AppConfig用于设置视图文件的视图位置后缀。

//MvcWebApplicationInitializer.java

بكيتاج com.w3codebox;
إدخال org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;  
فئة عامة MvcWebApplicationInitializer يتخطى  
        AbstractAnnotationConfigDispatcherServletInitializer {  
    @Override  
    محمية Class<?>[] getRootConfigClasses() {  
        الرجوع لـ new Class[] { WebSecurityConfig.class };  
    }  
    @Override  
    محمية Class<?>[] getServletConfigClasses() {  
        // TOdo Auto-generated method stub  
        الرجوع لـ null;  
    }  
    @Override  
    محمية String[] getServletMappings() {  
        الرجوع الجديد لـ new String[] { "/" };  
    }  
}

يستخدم هذا الفئة لت�始化 مسار البرمجيات (servlet dispatcher).

//SecurityWebApplicationInitializer.java

بكيتاج com.w3codebox;
إدخال org.springframework.security.web.context.*;  
فئة عامة SecurityWebApplicationInitializer  
    يتخطى AbstractSecurityWebApplicationInitializer {  
  
}

إنشاء فئة واحدة لإنشاء المستخدمين وتطبيق التحقق من الهوية وتحديد الصلاحيات في قابلية الوصول للمستخدم.

//WebSecurityConfig.java

بكيتاج com.w3codebox;
إدخال org.springframework.context.annotation.*;
إدخال org.springframework.security.config.annotation.web.builders.HttpSecurity;  
إدخال org.springframework.security.config.annotation.web.configuration.*;  
import org.springframework.security.core.userdetails.*;
import org.springframework.security.core.userdetails.User.UserBuilder;  
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() {
    // ensure the passwords are encoded properly
     UserBuilder users = User.withDefaultPasswordEncoder();
     InMemoryUserDetailsManager manager = new InMemoryUserDetailsManager();
     manager.createUser(users.username("mohan").password("1mohan23").roles("USER").build());
     manager.createUser(users.username("admin").password("admin123").roles("ADMIN").build());
     return manager;
    } 
  
@Override  
protected void configure(HttpSecurity http) throws Exception {  
      
      http.authorizeRequests().
      antMatchers("/index","/").permitAll()
      .antMatchers("/admin","/user").authenticated()
      .and();
      .formLogin();
      .and();
      .logout();
      .logoutRequestMatcher(new AntPathRequestMatcher("/logout"));
        
}  
}

التحكم

الآن، قم بإنشاء ملف تحكم لمعالجة الطلبات وإصدار الاستجابات.

//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="/user", method=RequestMethod.GET)  
    public String user() {  
       return "admin";
    }  
    @RequestMapping(value="/admin", method=RequestMethod.GET)  
    public String admin() {  
          
        return "admin";  
    }
}
 

العرض

أنشئ ملفات عرض (jsp) لعرض الخروج على المستخدم. لقد أنشأنا ثلاثة ملفات JSP، يرجى الرجوع إلى ما يلي.

//index.jsp

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

//user.jsp

<html>  
<head>  
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">  
<title>صفحة البداية</title>  
</head>  
<body>  
مرحبًا بكم في صفحة المستخدم!  
</body>  
</html>
 

//admin.jsp

في صفحة الإدارة، استخدمنا علامة authorize، التي يتم تقييمها فقط عند استيفاء دور محدد.

<%@ taglib uri="http://www.springframework.org/security/tags" prefix="security" %><html>  
<head>  
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 
<title>صفحة البداية</title>  
</head>  
<body>  
مرحبًا بك في صفحة الإدارة!
<a href="logout">logout</a> <br><br>
<security:authorize access="hasRole('ADMIN')">
مرحبًا ADMIN
</security:authorize>
<security:csrfInput/>
</body>  
</html>
 

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

مشروعنا يحتوي على التبعيات التالية المطلوبة لبناء التطبيق.

//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>springtaglibrary</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-taglibs -->
</dependency>
    <groupId>org.springframework.security</groupId>
    <artifactId>spring-security-taglibs</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>  
<!-- https://mvnrepository.com/artifact/org.springframework/spring-framework-bom -->
</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>
 

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


تشغيل التطبيق

انقر بزر الماوس الأيمن على المشروع، ثم اختر  تشغيل على الخادميظهر للمتصفح النتيجة التالية.



بمقابل تقديم   AppSecurityConfig الاعتمادات المحددة في الملف، انقر على المستخدم والولوج.



بعد الولوج بنجاح، سيتم عرض الصفحة الإدارية التالية. يرجى ملاحظة أن لم يتم عرض المحتوى الموجود داخل علامة authorize بسبب أن المستخدم لديه دور USER.



الخروج، الآن عبر تقديم معلومات الولوج كـ admin للاولوج.



بعد الولوج كمستخدم admin، يرجى مراجعة هذا التغريدة authorize للاختبار، وعرض النتيجة التالية.