English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Spring Security fournit ses propres étiquettes pour les pages JSP. Ces étiquettes sont utilisées pour accéder aux informations de sécurité dans les JSP et appliquer des contraintes de sécurité.
Les étiquettes suivantes sont utilisées pour protéger la couche de présentation de l'application.
Étiquette d'autorisation Étiquette d'authentification Marqueur Accesscontrollist Étiquette Csrfinput Balise CsrfMetaTags
Cette étiquette est utilisée à des fins d'autorisation. Cette étiquette évalue et vérifie si la requête est autorisée.
Il utilise deux attributs access et URL Pour vérifier l'autorisation de la requête. Nous pouvons évaluer cette étiquette à partir du rôle de l'utilisateur.
Le contenu affiché à l'intérieur de cette étiquette ne sera visible que si les attributs sont satisfaisants. Par exemple.
<sec:authorize access="hasRole('ADMIN')"> Il affichera uniquement si l'utilisateur est administrateur </sec:authorize>
Cette étiquette est utilisée pour accéder à l'authentification stockée dans le contexte de sécurité. Si l'Authentication est une instance de l'objet UserDetails, elle peut être utilisée pour obtenir les détails de l'utilisateur actuel. Par exemple.
<sec:authentication property="principal.username">
Ce marqueur est utilisé conjointement avec le module ACL de Spring Security. Il vérifie la liste des permissions nécessaires pour le domaine spécifié. Il ne s'exécute que si l'utilisateur actuel possède toutes les permissions. Par exemple.
<sec:accesscontrollist hasPermission="1,2"domainObject="${someObject}"> si l'utilisateur possède toutes les permissions représentées par les valeurs "1ou2sur l'objet donné. </sec:accesscontrollist>
Cette balise est utilisée pour créer un jeton CSRF pour un formulaire HTML. Pour l'utiliser, assurez-vous que la protection CSRF est activée. Nous devons placer cette balise à l'intérieur des balises pour créer un jeton CSRF. Par exemple.
<form method="post" action="/some/action"> <sec:csrfInput /> Nom:<br /> <input type="text" name="username" /> ... </form>
Elle insère une balise meta contenant le jeton CSRF, les champs du formulaire, le nom de l'en-tête et la valeur du jeton CSRF. Ces valeurs sont utiles pour définir le jeton CSRF dans le JavaScript de l'application.
Cette balise doit être placée à l'intérieur des balises HTML.
Pour implémenter l'un de ces balises, nous devons avoir le jar du taglib spring security dans notre application. Nous pouvons également l'ajouter avec la dépendance Maven suivante.
<dependency> <groupId>org.springframework.security</groupId> <artifactId>spring-security-taglibs</artifactId> <version>5.0.4.RELEASE</version> </dependency>
Dans une page JSP, nous pouvons utiliser les déclarations suivantes pour utiliser le taglib.
<%@ taglib prefix="sec" uri="http://www.springframework.org/security/tags" %>
Maintenant, regardons un exemple de mise en œuvre de ces balises dans un projet Maven Spring Security.
Nous utilisons STS (Spring Tools Suite) pour créer le projet. Voir l'exemple.
Cliquez Terminé > bouton, qui créera un projet Maven comme celui-ci:
Pour configurer Spring Security dans une application Spring MVC, placez les quatre fichiers suivants com.w3dans codeboxdossier.
AppConfig.java
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; } }
AppConfig est utilisé pour définir le suffixe de position de la vue des fichiers de vue.
//MvcWebApplicationInitializer.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[]{"}/"}; } }
该类用于初始化servlet调度程序。
//SecurityWebApplicationInitializer.java
package com.w3codebox; import org.springframework.security.web.context.*; public class SecurityWebApplicationInitializer extends AbstractSecurityWebApplicationInitializer { }
再创建一个用于创建用户并在用户可访问性上应用身份验证和授权的类。
//WebSecurityConfig.java
package com.w3codebox; import org.springframework.context.annotation.*; 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) 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("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")); } }
Maintenant, créez un contrôleur pour gérer les requêtes et fournir des réponses.
//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"; } }
Créez un fichier de vue (jsp) afin d'afficher les sorties aux utilisateurs. Nous avons déjà créé trois fichiers JSP, veuillez consulter le texte ci-dessous.
//index.jsp
<html> <head> <title>Page d'accueil</title> </head> <body> <a href="user">User</a> <a href="admin">Admin</a> <br> <br> Bienvenue à la w3codebox! </body> </html>
//user.jsp
<html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Page d'accueil</title> </head> <body> Bienvenue à la page utilisateur! </body> </html>
//admin.jsp
Dans la page de gestion,nous utilisons l'étiquette authorize,qui n'est évaluée que si le rôle donné est satisfait.
<%@ taglib uri="http://www.springframework.org/security/tags" prefix="security" %><html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Page d'accueil</title> </head> <body> Bienvenue à la page admin! <a href="logout">logout</a> <br><br> <security:authorize access="hasRole('ADMIN')"> Bonjour ADMIN </security:authorize> <security:csrfInput/> </body> </html>
Notre projet contient les dépendances nécessaires pour construire l'application.
//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>
Après avoir ajouté tous ces fichiers, notre projet apparaît ainsi:
Cliquez avec le bouton droit sur le projet, puis sélectionnez Exécution sur le serveurIl affiche le sorti suivant au navigateur.
En fournissant dans AppSecurityConfig Cliquez sur l'utilisateur et connectez-vous avec les informations d'identification définies dans le fichier.
Après la connexion réussie, il affichera la page de gestion suivante. Notez ici que, car l'utilisateur connecté a le rôle USER, le contenu entre les balises authorize n'est pas affiché.
Déconnexion, connectez-vous maintenant avec les informations d'identification de l'administrateur en tant qu'admin.
Après avoir connecté avec le compte admin, veuillez consulter cette étiquette authorize pour l'évaluation et afficher les sorties suivantes.