如何通过配置文件禁用Spring Security的@EnableWebSecurity与@EnableMethodSecurity特性
快速关闭Spring Security(含方法级安全)的解决方案
你当前的问题是:通过配置参数关闭SecurityFilterChain后,虽然Token验证失效,但@PreAuthorize注解仍在生效。这是因为方法级安全(@PreAuthorize)和Web层面的安全控制是两个独立模块,只关闭HttpSecurity的配置并不会影响方法级的权限校验。
下面是具体解决办法:
1. 控制方法级安全的开关
@EnableMethodSecurity注解支持通过enabled属性动态控制是否启用方法级权限校验,把这个属性绑定到配置文件参数即可:
@EnableMethodSecurity(enabled = "${security.method.enabled:true}") @EnableWebSecurity public class SecurityConfig { // 你的其他配置代码 }
2. 优化Web安全的关闭逻辑
原来的else块只关闭了securityContext,不够彻底,需要完全禁用所有Web层面的安全检查:
@Bean public SecurityFilterChain securityFilterChain(HttpSecurity http, JwtAuthenticationConverter converter) throws Exception { if (officeSecurityProperties.isEnable()) { http.authorizeHttpRequests( authorize -> authorize .requestMatchers("/doc.html", "/webjars/**", "/v3/api-docs/**").permitAll() .anyRequest().authenticated() ) .oauth2ResourceServer( oauth2 -> oauth2.jwt( jwt -> jwt.jwtAuthenticationConverter(converter) ) ); } else { // 彻底关闭Web层面所有安全校验 http.authorizeHttpRequests(auth -> auth.anyRequest().permitAll()) .csrf(AbstractHttpConfigurer::disable) .oauth2ResourceServer(AbstractHttpConfigurer::disable) .securityContext(AbstractHttpConfigurer::disable) .sessionManagement(AbstractHttpConfigurer::disable); } return http.build(); }
3. 配置文件中快速关闭
在配置文件(比如application.yml)中添加以下参数,重启服务即可完全关闭Spring Security的所有校验:
# 关闭Web层面安全 office: security: enable: false # 关闭方法级安全(@PreAuthorize) security: method: enabled: false
这样修改后,排查问题时只需要修改配置文件重启服务,再也不用移除注解重新编译部署了。
内容的提问来源于stack exchange,提问作者keyboardDog
相关产品推荐
相关产品推荐

