Spring Security 7 删掉了哪些旧写法?升级后哪些配置编译不过、替换成什么?这篇用 Security 6.5 与 7.0 把 32 种常见写法逐个编译,再用同一份新配置对比两个版本的路径授权结果。
Security 6.5(Boot 3.5.16):通过 10 / 10;Security 7.0(Boot 4.0.8):通过 2 / 10
lambda DSL:http.csrf(c -> c.disable()):6.5→通过;7.0→通过
lambda DSL:authorizeHttpRequests(a -> a.requestMatchers("/a").permitAll().anyRequest().authenticated()):6.5→通过;7.0→通过
旧写法:http.csrf().disable():6.5→通过;7.0→失败(method csrf in class HttpSecurity cannot be ap) ← 不同
旧写法:http.authorizeHttpRequests().anyRequest().authenticated():6.5→通过;7.0→失败(method authorizeHttpRequests in class HttpSecu) ← 不同
旧写法:http.authorizeRequests():6.5→通过;7.0→失败(cannot find symbol) ← 不同
旧写法:http.formLogin().and().httpBasic():6.5→通过;7.0→失败(method formLogin in class HttpSecurity cannot ) ← 不同
旧写法:http.formLogin() 无参:6.5→通过;7.0→失败(method formLogin in class HttpSecurity cannot ) ← 不同
旧写法:http.httpBasic() 无参:6.5→通过;7.0→失败(method httpBasic in class HttpSecurity cannot ) ← 不同
旧写法:http.headers().frameOptions().disable():6.5→通过;7.0→失败(method headers in class HttpSecurity cannot be) ← 不同
旧写法:http.sessionManagement().sessionCreationPolicy(…):6.5→通过;7.0→失败(method sessionManagement in class HttpSecurity) ← 不同无参重载与 .and() 链式在 7.0 里没了,只剩 lambda DSL。
Security 6.5(Boot 3.5.16):通过 10 / 11;Security 7.0(Boot 4.0.8):通过 5 / 11
AntPathRequestMatcher:6.5→通过;7.0→失败(cannot find symbol) ← 不同
AntPathRequestMatcher.antMatcher(…):6.5→通过;7.0→失败(cannot find symbol) ← 不同
PathPatternRequestMatcher.withDefaults().matcher(…):6.5→通过;7.0→通过
MvcRequestMatcher:6.5→通过;7.0→失败(cannot find symbol) ← 不同
FilterSecurityInterceptor:6.5→通过;7.0→失败(cannot find symbol) ← 不同
AccessDecisionManager:6.5→通过;7.0→失败(cannot find symbol) ← 不同
WebSecurityCustomizer:6.5→通过;7.0→通过
http.requestMatchers(…) 链式 securityMatcher:6.5→通过;7.0→通过
@EnableGlobalMethodSecurity:6.5→通过;7.0→通过
@EnableMethodSecurity:6.5→通过;7.0→通过
WebSecurityConfigurerAdapter:6.5→失败(cannot find symbol);7.0→失败(cannot find symbol)AntPathRequestMatcher、MvcRequestMatcher、FilterSecurityInterceptor、AccessDecisionManager 在 7.0 里没了,PathPatternRequestMatcher 是替代。
Security 6.5(Boot 3.5.16):通过 8 / 11;Security 7.0(Boot 4.0.8):通过 7 / 11
DaoAuthenticationProvider 无参构造:6.5→通过;7.0→失败(constructor DaoAuthenticationProvider in class) ← 不同
DaoAuthenticationProvider(UserDetailsService):6.5→通过;7.0→通过
Pbkdf2PasswordEncoder 无参构造:6.5→失败(no suitable constructor found for Pbkdf2Passwo);7.0→失败(no suitable constructor found for Pbkdf2Passwo)
Pbkdf2PasswordEncoder.defaultsForSpringSecurity_v5_8():6.5→通过;7.0→通过
SCryptPasswordEncoder 无参构造:6.5→失败(constructor SCryptPasswordEncoder in class SCr);7.0→失败(constructor SCryptPasswordEncoder in class SCr)
Argon2PasswordEncoder 无参构造:6.5→失败(constructor Argon2PasswordEncoder in class Arg);7.0→失败(constructor Argon2PasswordEncoder in class Arg)
BCryptPasswordEncoder 无参构造:6.5→通过;7.0→通过
StandardPasswordEncoder:6.5→通过;7.0→通过
Md4PasswordEncoder:6.5→通过;7.0→通过
NoOpPasswordEncoder.getInstance():6.5→通过;7.0→通过
User.withDefaultPasswordEncoder():6.5→通过;7.0→通过DaoAuthenticationProvider 必须传 UserDetailsService;几个编码器的无参构造两个版本都不能用。
路径 → 状态码(401 = 被安全过滤器挡住,200 = 到达了 Controller)
/admin/x 6.5 → 401;7.0 → 401
/admin 6.5 → 401;7.0 → 401
/admin/ 6.5 → 401;7.0 → 401
/admin//x 6.5 → 400;7.0 → 400
/admin/./x 6.5 → 400;7.0 → 400
/admin/x/ 6.5 → 401;7.0 → 401
/ADMIN/x 6.5 → 200;7.0 → 200
/admin;a=b/x 6.5 → 400;7.0 → 400
/%61dmin/x 6.5 → 401;7.0 → 401
/admin%2Fx 6.5 → 400;7.0 → 400
/admin/x.json 6.5 → 401;7.0 → 401
/public 6.5 → 200;7.0 → 200新写法配置在两个版本上路径授权结果一致。