最近在做技术升级工作,Spring Boot 2.x升级Spring Boot 3.x自然也就涉及到Security(Security5.x升级Security6.x)SecurityFilterChain相关的配置和示例说明。
SecurityFilterChain 是Spring Security 5.4及更高版本中引入的一个关键概念,它取代了之前的WebSecurityConfigurerAdapter作为配置安全性的主要方式。SecurityFilterChain 是Spring Security中用来配置安全过滤器链的主要方式,它提供了丰富的API来定制和管理安全设置。下面详细介绍SecurityFilterChain中可用的一些主要配置选项及其用途。
1. authorizeHttpRequests
authorizeHttpRequests 是用于配置哪些请求需要认证以及哪些请求可以匿名访问的关键方法。它允许你根据请求的URL、HTTP方法等来决定是否需要认证。
示例配置
http
.authorizeHttpRequests((authorize) -> authorize
.requestMatchers("/public/**").permitAll() // 公共资源
.requestMatchers(HttpMethod.POST, "/secure/post/**").hasRole("ADMIN") // POST请求需要管理员权限
.anyRequest().authenticated() // 其他所有请求都需要认证
);
2. formLogin
formLogin 用于配置传统的表单登录页面。
示例配置
http
.formLogin((form) -> form
.loginPage("/login") // 自定义登录页面
.loginProcessingUrl("/login") // 处理登录请求的URL
.defaultSuccessUrl("/welcome", true) // 登录成功后的默认跳转URL
.failureUrl("/login?error") // 登录失败后的URL
.permitAll() // 允许任何人访问登录页面
);
3. httpBasic
httpBasic 用于配置基本的身份验证,通常用于RESTful服务或API。
示例配置
http
.httpBasic(Customizer.withDefaults()); // 启用HTTP Basic认证
4. logout
logout 用于配置登出逻辑。
示例配置
http
.logout((logout) -> logout
.logoutUrl("/logout") // 登出请求的URL
.logoutSuccessUrl("/login?logout") // 登出成功后的URL
.permitAll() // 允许任何人访问登出URL
);
5. sessionManagement
sessionManagement 用于配置会话管理,例如是否自动创建会话、会话超时时间等。
示例配置
http
.sessionManagement((session) -> session
.sessionCreationPolicy(SessionCreationPolicy.IF_REQUIRED) // 默认策略,需要时创建会话
.maximumSessions(1) // 最大会话数
.maxSessionsPreventsLogin(false) // 是否阻止登录
.expiredUrl("/session-expired") // 会话过期后的URL
);
6. cors
cors 用于配置跨域资源共享(CORS),允许你控制哪些源可以访问你的应用程序。
示例配置
http
.cors((cors) -> cors
.configurationSource(request -> newCorsConfiguration()) // 自定义CORS配置
);
7. csrf
csrf 用于配置跨站请求伪造(CSRF)保护。
示例配置
http
.csrf((csrf) -> csrf
.disable() // 禁用CSRF保护
.csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse()) // 自定义CSRF令牌存储
);
8. oauth2Login
oauth2Login 用于配置OAuth2登录。
示例配置
http
.oauth2Login((oauth2) -> oauth2
.loginPage("/login/oauth2") // OAuth2登录页面
.userInfoEndpoint((userInfo) -> userInfo
.userService(oAuth2UserService) // 自定义OAuth2用户服务
)
);
9. oauth2ResourceServer
oauth2ResourceServer 用于配置OAuth2资源服务器,保护API端点。
示例配置
http
.oauth2ResourceServer((oauth2) -> oauth2
.jwt(Customizer.withDefaults()) // 配置JWT令牌验证
);
10. rememberMe
rememberMe 用于配置记住我功能,使用户在关闭浏览器后仍能保持登录状态。
示例配置
http
.rememberMe((rememberMe) -> rememberMe
.key("uniqueAndSecret") // 密钥
.tokenValiditySeconds(1209600) // 记住我令牌的有效期(秒)
.userDetailsService(userDetailsService) // 用户详细信息服务
);
11. exceptionHandling
exceptionHandling 用于配置异常处理。
示例配置
http
.exceptionHandling((exceptions) -> exceptions
.authenticationEntryPoint(new MyAuthenticationEntryPoint()) // 自定义未认证入口点
.accessDeniedHandler(new MyAccessDeniedHandler()) // 自定义拒绝访问处理器
);
12. headers
headers 用于配置响应头,如X-Frame-Options等。
示例配置
http
.headers((headers) -> headers
.frameOptions(frameOptions -> frameOptions.sameOrigin()) // 配置X-Frame-Options
);
13. authenticationManager
authenticationManager 用于配置认证管理器。
示例配置
@Bean
public AuthenticationManager authenticationManager(HttpSecurity http) throws Exception {
return http.getSharedObject(AuthenticationManagerBuilder.class)
.authenticationProvider(authenticationProvider())
.and()
.build();
}
14. authenticationProvider
authenticationProvider 用于配置认证提供者。
示例配置
@Bean
public AuthenticationProvider authenticationProvider() {
DaoAuthenticationProvider provider = new DaoAuthenticationProvider();
provider.setUserDetailsService(userDetailsService);
provider.setPasswordEncoder(passwordEncoder);
return provider;
}
15. addFilterBefore 和 addFilterAfter
addFilterBefore 和 addFilterAfter 用于在安全过滤器链中插入自定义过滤器。
示例配置
http
.addFilterBefore(myCustomFilter, UsernamePasswordAuthenticationFilter.class); // 在UsernamePasswordAuthenticationFilter之前插入过滤器
总结
SecurityFilterChain 提供了非常强大的功能来定制和管理Spring Security的安全过滤器链。通过上述配置选项,你可以灵活地配置各种安全需求,从简单的表单登录到复杂的OAuth2集成,再到细粒度的URL访问控制。这些配置选项可以组合使用,以满足几乎所有的安全需求。
1041

被折叠的 条评论
为什么被折叠?



