English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
除了身份验证,Spring Security还检查登录用户的授权。登录后,将根据用户的ROLE完成授权用户访问资源的操作。
在WebSecurityConfig类中创建用户时,我们也可以指定用户的ROLE。
应用于方法的安全性仅限于未经授权的用户,并且仅允许真实用户。
让我们看一个示例。首先,通过提供详细信息创建一个Maven项目。
该项目最初看起来像这样:
现在,配置应用程序以防止未经授权和未经身份验证的用户。它需要下面给出的四个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 "; } }
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>
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>
Añadir todos los archivos anteriores, nuestro proyecto se verá así:
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.
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.