English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
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ì:
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")); } }
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"; } }
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>
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>
Aggiunti tutti i file elencati, il nostro progetto appare come segue:
Output:
Primo accesso come ADMIN
Dopo il login,
Clicca Aggiornamento recordPoi controlla se il record è stato aggiornato, poiché il ruolo dell'utente è ADMIN.
Ora, accedi come utente.
Ora, clicca Aggiornamento recordPoiché il ruolo dell'utente è USER, il server ha rifiutato l'accesso.