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

Spring方法级别的安全性

除了身份验证,Spring Security还检查登录用户的授权。登录后,将根据用户的ROLE完成授权用户访问资源的操作。

在WebSecurityConfig类中创建用户时,我们也可以指定用户的ROLE。

应用于方法的安全性仅限于未经授权的用户,并且仅允许真实用户。

让我们看一个示例。首先,通过提供详细信息创建一个Maven项目。



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



Spring security配置

现在,配置应用程序以防止未经授权和未经身份验证的用户。它需要下面给出的四个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.java

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

//SecurityWebApplicationInitializer.java

باقة com.w3codebox;
استيراد org.springframework.security.web.context.*;  
مستخدم عام class SecurityWebApplicationInitializer  
    يتخطى AbstractSecurityWebApplicationInitializer {  
}

//WebSecurityConfig.java

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

باقة com.w3codebox;
استيراد org.springframework.context.annotation.*;
استيراد org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity;
استيراد 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.User.UserBuilder;  
import org.springframework.security.provisioning.InMemoryUserDetailsManager;
import org.springframework.security.web.util.matcher.AntPathRequestMatcher;  
@EnableWebSecurity  
@ComponentScan("com.w3codebox")  
@EnableGlobalMethodSecurity(prePostEnabled=true)
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("irfan").password("user123").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 ایجاد شده و در com.w3codebox.controller در این پکیج.

// HomeController.java

package com.w3codebox.controller;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.stereotype.Controller;  
import org.springframework.web.bind.annotation.RequestMapping;  
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller  
public class HomeController {  
    @RequestMapping(value="/", method=RequestMethod.GET)  
    public String index() {  
        return \  
    }  
    @RequestMapping(value="/user", method=RequestMethod.GET)  
    public String user() {  
       return \
    }  
    @RequestMapping(value="/admin", method=RequestMethod.GET)  
    public String admin() {  
        return \  
    }
    // فقط، شخصی که نقش ADMIN دارد می‌تواند به این روش دسترسی داشته باشد.
    @RequestMapping(value="/update", method=RequestMethod.GET) 
    @ResponseBody
    @PreAuthorize("hasRole('ROLE_ADMIN')")
    public String update() {  
        return "updated record ";  
    }
}

النماذج

أنشئ النماذج التالية (صفحات JSP) لإنتاج输出来ً للاستخدام. WEB-INF/views مجلد.

//index.jsp

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

//admin.jsp

<html>  
<head>  
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">  
<title>صفحة البداية</title>  
</head>  
<body>  
<span style="color: green">نجاح الدخول!</span>؟<a href="logout" style="text-decoration: none;"> تسجيل الخروج</a>    <br>    <br>
<a href="update" style="text-decoration: none;">تحديث السجل</a>
</body>  
</html>

تجميع الإرتباطات

فيما يلي إرتباطات الحاجة لتكوين هذا المشروع.

<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>springmethod</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/org.springframework/spring-beans -->
        <!-- 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>

هيكل المشروع

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



تشغيل الخادم

الإخراج:



الدخول لأول مرة كمستخدم ADMIN



بعد الدخول،



انقر تحديث السجلات، ثم راقب ما إذا تم تحديث السجلات أم لا، لأن دور المستخدم هو ADMIN.



دخول المستخدم

الآن، قم بالدخول كمستخدم.




الآن، انقر تحديث السجلات، لأن دور المستخدم هو USER، يرفض الخادم الوصول.