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

Sécurité de niveau méthode Spring

En plus de l'authentification, Spring Security vérifie également l'autorisation de l'utilisateur connecté. Après la connexion, l'accès aux ressources de l'utilisateur sera autorisé en fonction de son RÔLE.

Lors de la création d'un utilisateur dans la classe WebSecurityConfig, nous pouvons également spécifier le RÔLE de l'utilisateur.

La sécurité appliquée à la méthode est limitée aux utilisateurs non autorisés et ne permet qu'aux utilisateurs réels.

Laissons-voir un exemple. Premièrement, créez un projet Maven en fournissant des détails.



Ce projet semble initialement ainsi:



Configuration de Spring security

Maintenant, configurez l'application pour empêcher les utilisateurs non autorisés et non authentifiés. Il nécessite les quatre fichiers Java suivants, créez un paquet com.w3codebox et le placer à l'intérieur.

//AppConfig.java

Cette classe est utilisée pour définir les préfixes et suffixes des vues avec l'aide du résolveur de vue.

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

Cette classe est utilisée pour créer des utilisateurs et définir leur authentification. Chaque fois qu'un utilisateur souhaite accéder à l'application, il doit se connecter.

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() {}}
    // s'assurer que les mots de passe sont correctement codés
     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
      .and()
      .formLogin()
      .and()
      .logout()
      .logoutRequestMatcher(new AntPathRequestMatcher("/logout"));
}  
}

contrôleur

créer le contrôleur HomeController et le placer dans com.w3codebox.controller dans le paquet.

//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";  
    }
    // Seul une personne ayant le rôle ADMIN peut accéder à cette méthode.
    @RequestMapping(value="/update, method=RequestMethod.GET) 
    @ResponseBody
    @PreAuthorize("hasRole('ROLE_ADMIN')")
    public String update() {  
        return "record mis à jour ";  
    }
}

vues

Créez les vues suivantes (pages JSP) pour générer des sorties pour les utilisateurs. Mettez toutes les vues dans WEB-INF/views dossier.

//index.jsp

<html>  
<head>  
<title>Page d'accueil</title>  
</head>  
<body>  
Bienvenue sur w3codebox! <br> <br>
Se connecter en tant que: 
<a href="admin">Admin</a> <a href="user">Utilisateur</a>
</body>  
</html>

//admin.jsp

<html>  
<head>  
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">  
<title>Page d'accueil</title>  
</head>  
<body>  
<span style="color: vert" >Connexion réussie !</span> ? <a href="logout" style="text-decoration: none;">déconnexion</a> <br> <br>
<a href="update" style="text-decoration: none;">Mettre à jour l'enregistrement</a>
</body>  
</html>

Paquetage des dépendances

Voici les dépendances nécessaires pour créer ce projet.

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

Structure du projet

Après avoir ajouté tous les fichiers ci-dessus, notre projet est le suivant:



Lancer le serveur

Sortie:



Première connexion en tant qu'ADMIN



Après la connexion,



Cliquez sur Mise à jour des enregistrements,puis vérifiez si les enregistrements ont été mis à jour, car le rôle de l'utilisateur est ADMIN.



Connexion utilisateur

Maintenant, connectez-vous en tant qu'utilisateur.




Maintenant, cliquez sur Mise à jour des enregistrements,parce que le rôle de l'utilisateur est USER, le serveur refuse l'accès.