@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true, securedEnabled = true)
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
private MyAuthenticationSuccessHandler authenticationSuccessHandler;
@Autowired
private MyAuthenticationFailureHandler authenticationFailureHandler;
@Autowired
private MyLogoutSuccessHandler logoutSuccessHandler;
@Autowired
private TokenAuthenticationFilter tokenAuthenticationFilter;
@Override
protected void configure(HttpSecurity http) throws Exception {
http.headers().contentSecurityPolicy("script-src 'self'");
http.formLogin()
.and()
.logout().logoutUrl("/logout").logoutSuccessHandler(logoutSuccessHandler)
.and()
.authorizeRequests()
.antMatchers("/login", "/captcha", "/demo/**").permitAll()
.antMatchers("/doc.html", "/swagger-resources/**", "/*/api-docs/**", "/webjars/**", "/favicon.ico").permitAll()
.anyRequest().authenticated()
.and()
.exceptionHandling()
.accessDeniedHandler(new MyAccessDeniedHandler())
.authenticationEntryPoint(new MyAuthenticationEntryPoint())
.and()
.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS);
//.maximumSessions(1)
//.maxSessionsPreventsLogin(false);
http.addFilterAt(userAuthenticationFilter(), UsernamePasswordAuthenticationFilter.class)
.addFilterBefore(tokenAuthenticationFilter, UserAuthenticationFilter.class);
http.csrf().disable();
}
@Bean
protected UserAuthenticationFilter userAuthenticationFilter() throws Exception {
UserAuthenticationFilter filter = new UserAuthenticationFilter();
filter.setAuthenticationManager(authenticationManagerBean());
//setAuthenticationManager()方法用于设置认证管理器(AuthenticationManager)。 //authenticationManagerBean()是一个由Spring Security自动生成的方法,用于获取全局的
//AuthenticationManager实例。
filter.setAuthenticationSuccessHandler(authenticationSuccessHandler);
filter.setAuthenticationFailureHandler(authenticationFailureHandler);
//这两行代码用于设置认证成功和认证失败的处理器。authenticationSuccessHandler和
//authenticationFailureHandler是自定义的认证成功和认证失败处理器,您可以根据实际需求来设置这
//两个处理器来处理相应的逻辑。
return filter;
}
configure(WebSecurity web)
和configure(HttpSecurity http)
这两个方法在Spring Security中有不同的作用和用途:
-
configure(WebSecurity web)
方法:- 这个方法用于配置Spring Security忽略特定的静态资源和路径,例如CSS、JavaScript文件或静态图片等。
- 它是在较早的安全过滤器链中执行的,用于配置不需要Spring Security进行认证和授权的静态资源路径。
- 这个方法通常用于配置Web安全性,特别是配置Spring Security的忽略规则。
-
configure(HttpSecurity http)
方法:- 这个方法用于配置Spring Security的请求级安全性,定义哪些URL路径需要进行认证和授权,以及定义相关配置和规则。
- 它是在较后的安全过滤器链中执行的,用于配置具体的请求级别安全策略、添加过滤器、拦截器等。
- 这个方法通常用于配置HTTP请求的安全性、登录认证、访问控制、表单登录、注销等。
综上所述,configure(WebSecurity web)
方法用于配置忽略特定的静态资源和路径,而configure(HttpSecurity http)
方法用于配置请求级别的安全性、认证和授权策略。
在一个Spring Security配置类中,configure(WebSecurity web)
方法通常在类的开头和configure(HttpSecurity http)
方法之前调用,它们具有不同的作用和顺序。需要根据具体的需求配置和调整这两个方法。
当需要配置Spring Security忽略特定的静态资源或路径时,可以使用`configure(WebSecurity web)`方法。下面是一个示例:
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
public void configure(WebSecurity web) throws Exception {
web
.ignoring()
.antMatchers("/css/**", "/js/**", "/images/**");
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/admin/**").hasRole("ADMIN")
.antMatchers("/user/**").hasAnyRole("ADMIN", "USER")
.anyRequest().authenticated()
.and()
.formLogin()
.and()
.logout()
.logoutSuccessUrl("/login");
}
// 其他配置...
}
在上面的例子中,`configure(WebSecurity web)`方法配置了忽略 `/css/**`, `/js/**`, 和 `/images/**` 这些静态资源路径,这些路径将不会受到Spring Security的保护和认证。
同时,`configure(HttpSecurity http)`方法配置了请求级别的安全性和授权策略,其中 `/admin/**` 路径需要具有 "ADMIN" 角色的用户来访问,`/user/**` 路径需要具有 "ADMIN" 或 "USER" 角色的用户来访问,其余的请求路径需要进行认证,并且使用默认的表单登录方式和注销设置。
请注意,此示例仅用于说明两种方法的区别和用途,并不表示一个完整的配置。具体的配置和规则需要根据您的项目需求进行调整。