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

Sicurezza di livello di metodo di Spring

Oltre all'autenticazione, Spring Security verifica anche l'autorizzazione dell'utente che si è loggato. Dopo il login, l'accesso ai risorse dell'utente verrà completato in base al ROLE dell'utente.

Quando si crea un utente in WebSecurityConfig, possiamo anche specificare il ROLE dell'utente.

La sicurezza applicata al metodo è limitata agli utenti non autorizzati e consente solo agli utenti reali.

Vediamo un esempio. Prima di tutto, crea un progetto Maven fornendo i dettagli.



Il progetto inizialmente sembra così:



Configurazione di Spring security

Ora, configura l'applicazione per prevenire l'accesso non autorizzato e non autenticato degli utenti. È necessario creare i quattro file Java elencati di seguito e creare un pacchetto com.w3codebox e metterlo al suo interno.

//AppConfig.java

Questo tipo viene utilizzato per impostare il prefisso e suffisso delle viste con l'aiuto del parser delle viste.

package 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

package 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

package com.w3codebox;
import org.springframework.security.web.context.*;  
public class SecurityWebApplicationInitializer  
    estende AbstractSecurityWebApplicationInitializer {  
}

//WebSecurityConfig.java

Questa classe viene utilizzata per creare utenti e impostare la loro autenticazione. Ogni volta che un utente deve accedere all'applicazione, deve effettuare il login.

package com.w3codebox;
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.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"));
}  
}

il controller

Creare il controller HomeController e inserirlo in com.w3codebox.controller nel pacchetto.

//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 \  
    }
    // Solo, una persona con ruolo ADMIN può accedere a questo metodo.
    @RequestMapping(value="/update", method=RequestMethod.GET) 
    @ResponseBody
    @PreAuthorize("hasRole('ROLE_ADMIN')")
    public String update() {  
        return "record aggiornato";  
    }
}

Viste

Crea le seguenti viste (pagine JSP) per generare l'output per gli utenti. Metti tutte le viste in WEB-INF/views Cartella.

//index.jsp

<html>  
<head>  
<title>Pagina Iniziale</title>  
</head>  
<body>  
Benvenuto su w3codebox! <br> <br>
Accedi come: 
<a href="admin">Admin</a> <a href="user">Utente</a>
</body>  
</html>

//admin.jsp

<html>  
<head>  
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">  
<title>Pagina Iniziale</title>  
</head>  
<body>  
<span style="color: green">Login Riuscito!</span> ? <a href="logout" style="text-decoration: none;">Esci</a> <br> <br>
<a href="update" style="text-decoration: none;">Aggiorna Record</a>
</body>  
</html>

Pacchettizzazione delle dipendenze

Di seguito sono riportati i dipendenze necessarie per creare questo progetto.

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

Struttura del progetto

Aggiunti tutti i file elencati, il nostro progetto appare come segue:



Esegui il server

Output:



Primo accesso come ADMIN



Dopo il login,



Clicca Aggiornamento recordPoi controlla se il record è stato aggiornato, poiché il ruolo dell'utente è ADMIN.



Accesso utente

Ora, accedi come utente.




Ora, clicca Aggiornamento recordPoiché il ruolo dell'utente è USER, il server ha rifiutato l'accesso.