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

Spring方法级别的安全性

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

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

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

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



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



Spring security配置

现在,配置应用程序以防止未经授权和未经身份验证的用户。它需要下面给出的四个Java文件,创建一个包com.w3codebox并将其放在其中。

//AppConfig.java

此类用于在视图解析器的帮助下设置视图后缀和前缀。

package com.w;3codebox;
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

package com.w;3codebox;
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

package com.w;3codebox;
import org.springframework.security.web.context.*;  
public class SecurityWebApplicationInitializer  
    extends AbstractSecurityWebApplicationInitializer {  
}

//WebSecurityConfig.java

Este clase se utiliza para crear usuarios y configurar su autenticación. Cada vez que un usuario quiera acceder a la aplicación, debe iniciar sesión.

package com.w;3codebox;
import org.springframework.context.annotation.*;
import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;  
import 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.w")3codebox")  
@EnableGlobalMethodSecurity(prePostEnabled=true)
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {  
@Bean  
}
    // public UserDetailsService userDetailsService() {
     确保密码被正确编码
     UserBuilder users = User.withDefaultPasswordEncoder();
InMemoryUserDetailsManager manager = new InMemoryUserDetailsManager();123manager.createUser(users.username("irfan").password("user").roles("USER").build());
manager.createUser(users.username("admin").password("admin").roles("USER").build());123").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.w;3codebox.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 "index";  
    }  
    @RequestMapping(value="/user, method=RequestMethod.GET)  
    public String user() {  
       return "admin";
    }  
    @RequestMapping(value="/admin, method=RequestMethod.GET)  
    public String admin() {  
        return "admin";  
    }
    // Sólo, una persona con el rol ADMIN puede acceder a este método.
    @RequestMapping(value="/update, method=RequestMethod.GET) 
    @ResponseBody
    @PreAuthorize("hasRole('ROLE_ADMIN')")
    public String update() {  
        return "registro actualizado ";  
    }
}

vistas

Cree las siguientes vistas (páginas JSP) para generar salida para los usuarios. Coloque todas las vistas en WEB-INF/views carpeta.

//index.jsp

<html>  
<head>  
<title>Página de inicio</title>  
</head>  
<body>  
¡Bienvenido a w3codebox! <br> <br>
Iniciar sesión como: 
<a href="admin">Admin</a> <a href="user">Usuario</a>
</body>  
</html>

//admin.jsp

<html>  
<head>  
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">  
<title>Página de inicio</title>  
</head>  
<body>  
<span style="color: verde">¡Inicio de sesión exitoso!/span> ? <a href="logout" style="text-decoración: ninguna;">cerrar sesión</a> <br> <br>
<a href="update" style="text-decoración: ninguna;">Actualizar Registro</a>
</body>  
</html>

Paquetes de empaquetado

A continuación se presentan los elementos de dependencia necesarios para crear este proyecto.

<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>/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>/groupId>  
            <artifactId>maven-war-plugin>/artifactId>  
            <version>2.6</version>
                   <configuration>  
                <failOnMissingWebXml>false</failOnMissingWebXml>/failOnMissingWebXml>  
            </configuration>  
        </plugin>  
    </plugins>  
  </build>  
</project>

Estructura del proyecto

Añadir todos los archivos anteriores, nuestro proyecto se verá así:



Ejecutar el servidor

Salida:



Primera vez que se inicia sesión como ADMIN



Después de iniciar sesión,



Haga clic Actualización de registros, luego verifique si los registros se han actualizado, ya que el rol del usuario es ADMIN.



Inicio de sesión de usuario

Ahora, inicie sesión como usuario.




Ahora, haga clic Actualización de registros, ya que el rol del usuario es USER, el servidor rechaza el acceso.