Spring Boot 2.7.3基于表达式的访问控制配置异常求助
在Spring Boot 2.7.3搭配Spring Security Starter时,弃用authorizeRequests改用authorizeHttpRequests后,原SpEL表达式的写法会抛出类型不匹配错误:要求AuthorizationManager<RequestAuthorizationContext>类型,但传入的是字符串。而旧的authorizeRequests方法可以正常运行。
解决方案
在新的authorizeHttpRequests配置中,需要将SpEL表达式封装为AuthorizationManager实例,使用AuthorizationManagers.expression()方法即可快速实现:
import static org.springframework.security.authorization.AuthorizationManagers.expression; // ... http .authorizeHttpRequests(authorize -> authorize .antMatchers("/user/**").access(expression("@webSecurity.check(authentication, request)")) // 其他授权规则配置 );
原理说明
Spring Security 5.7+(对应Spring Boot 2.7+)重构了授权架构,authorizeHttpRequests采用基于AuthorizationManager的新模型,不再直接接受SpEL字符串。AuthorizationManagers.expression()方法会将传入的SpEL表达式转换为符合要求的AuthorizationManager实例,适配新的API规范。
需要确保webSecurity bean已正确定义,且check方法的参数类型匹配:第一个参数为Authentication,第二个参数为HttpServletRequest(RequestAuthorizationContext中的request对象实际是HttpServletRequest)。
内容的提问来源于stack exchange,提问作者Eans

