首先,为了搭建Spring Security的环境,我们需要在项目的依赖中引入相关的依赖项。可以在项目的 pom.xml 文件中添加以下依赖项:
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-core</artifactId>
<version>5.5.0</version>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-web</artifactId>
<version>5.5.0</version>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-config</artifactId>
<version>5.5.0</version>
</dependency>
其中,spring-security-core
是Spring Security的核心库,spring-security-web
是实现 Web 安全相关功能的库,spring-security-config
则提供了 Spring Security 配置相关功能。
接下来,我们需要创建一个 Spring Security 配置类,该类需要继承 WebSecurityConfigurerAdapter
。以下是一个简单的 Spring Security 配置类的例子:
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
.antMatchers("/admin/**").hasRole("ADMIN")
.antMatchers("/user/**").hasRole("USER")
.anyRequest().authenticated()
.and()
.formLogin();
}
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.inMemoryAuthentication()
.withUser("admin").password("admin").roles("ADMIN")
.and()
.withUser("user").password("user").roles("USER");
}
}
在上面的配置类中,我们配置了两个权限规则,即 /admin/**
的访问需要 ADMIN
角色,/user/**
的访问需要 USER
角色;对于没有匹配到权限规则的请求,需要通过身份验证后才能访问;最后,我们提供了两个用户的身份认证信息。
接下来,我们需要在 Web 应用的配置类中应用这个 Spring Security 配置类,以确保 Spring Security 生效。以下是一个简单的 Web 应用配置类的例子:
@Configuration
@ComponentScan(basePackages = "com.example.demo")
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {
@Autowired
private SecurityConfig securityConfig;
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new LoggerInterceptor());
}
@Override
public void addViewControllers(ViewControllerRegistry registry) {
registry.addViewController("/").setViewName("index");
registry.addViewController("/login").setViewName("login");
}
@Override
public void configureViewResolvers(ViewResolverRegistry registry) {
registry.jsp("/WEB-INF/views/", ".jsp");
}
@Override
public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
configurer.enable();
}
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/resources/**").addResourceLocations("/resources/");
}
@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
converters.add(new MappingJackson2HttpMessageConverter());
}
@Override
public void configurePathMatch(PathMatchConfigurer configurer) {
configurer.setUseSuffixPatternMatch(false);
}
@Override
public void configureContentNegotiation(ContentNegotiationConfigurer configurer) {
configurer.defaultContentType(MediaType.APPLICATION_JSON);
}
@Bean
public ViewResolver viewResolver() {
InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();
viewResolver.setViewClass(JstlView.class);
viewResolver.setPrefix("/WEB-INF/views/");
viewResolver.setSuffix(".jsp");
return viewResolver;
}
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**").allowedOrigins("*").allowedMethods("GET", "POST", "PUT", "DELETE");
}
@Override
public void configure(WebSecurity web) throws Exception {
web.ignoring().antMatchers("/resources/**");
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http.csrf().disable();
http.authorizeRequests()
.antMatchers("/admin/**").hasRole("ADMIN")
.antMatchers("/user/**").hasRole("USER")
.anyRequest().authenticated()
.and()
.formLogin()
.loginPage("/login")
.permitAll();
}
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.userDetailsService(userDetailsService()).passwordEncoder(passwordEncoder());
}
@Bean
public UserDetailsService userDetailsService() {
InMemoryUserDetailsManager manager = new InMemoryUserDetailsManager();
manager.createUser(User.withUsername("admin").password(passwordEncoder().encode("admin")).roles("ADMIN").build());
manager.createUser(User.withUsername("user").password(passwordEncoder().encode("user")).roles("USER").build());
return manager;
}
}
在上面的配置类中,我们首先创建了一个 PasswordEncoder
的 Bean,我们可以在用户认证时使用该 Bean 来加密用户的密码。接着,我们通过 SecurityConfig
的 @Autowired
注解引入了 Spring Security 的配置类。然后我们通过实现 WebMvcConfigurer
接口,来对 Web 应用进行配置。在 configure(WebSecurity web)
函数中,我们忽略了针对 /resources/**
路径的所有安全性检查,因为这类路径下一般不包含敏感信息。在 configure(HttpSecurity http)
函数中,我们配置了访问 /admin/**
和 /user/**
的权限规则,并且指定了默认的登录页是 /login
。最后,我们使用 InMemoryUserDetailsManager
来提供用户身份认证信息。
接下来,我们来看一下如何在一个 Spring Boot 应用中使用 Spring Security。在 Spring Boot 应用中,我们只需要添加 spring-boot-starter-security
依赖即可使用 Spring Security。例如,下面是一个使用 Spring Security 的 Spring Boot 应用的配置文件:
server:
port: 8080
spring:
datasource:
url: jdbc:mysql://localhost:3306/test?useSSL=false
username: root
password: password
driver-class-name: com.mysql.jdbc.Driver
security:
user:
name: admin
password: password
role:
admin: ADMIN
在上面的配置文件中,我们配置了一个使用 MySQL 作为数据库的 Spring Boot 应用,并且使用了 Spring Security 来对应用进行安全性检查。在 spring.security.user
部分,我们指定了一个用户名和密码,用户名为 admin
,密码为 password
;在 spring.security.role
部分,我们指定了该用户的角色为 ADMIN
。
以上是关于 Spring Security环境搭建的完整攻略,包含了基于XML方式进行Spring Security配置和基于Java Config方式进行Spring Security配置两个示例,通过这两个示例,相信读者们对于Spring Security环境的搭建能够有较为深入的了解。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:spring security环境搭建 - Python技术站