配置禁用Spring Security仍遇AuthorizationDeniedException的正确解法
如何正确配置禁用Spring Security并解决访问拒绝异常?
问题描述
已编写如下配置类,希望通过no-authentication profile禁用Spring Security并允许所有请求:
public class DefaultSecurityConfig { @Bean @Order(1) @Profile("no-authentication") public SecurityFilterChain noAuthSecurityFilterChain(final HttpSecurity httpSecurity) throws Exception { return httpSecurity .csrf(AbstractHttpConfigurer::disable) .formLogin(AbstractHttpConfigurer::disable) .authorizeHttpRequests(auth -> auth.anyRequest().permitAll() ) .build(); } }
Gradle依赖配置:
implementation 'org.springframework.boot:spring-boot-starter-security' implementation 'org.springframework.security:spring-security-oauth2-resource-server'
但运行时仍出现访问拒绝异常:
org.springframework.security.authorization.AuthorizationDeniedException: Access Denied at org.springframework.security.authorization.method.ThrowingMethodAuthorizationDeniedHandler.handleDeniedInvocation(ThrowingMethodAuthorizationDeniedHandler.java:38) ~[spring-security-core-6.5.0.jar:6.5.0] at org.springframework.security.authorization.method.PreAuthorizeAuthorizationManager.handleDeniedInvocation(PreAuthorizeAuthorizationManager.java:108) ~[spring-security-core-6.5.0.jar:6.5.0]
问题原因
异常栈指向PreAuthorizeAuthorizationManager,说明项目中存在方法级权限注解(如@PreAuthorize),Spring Security的请求级安全配置(HttpSecurity中的permitAll)不会覆盖方法级安全校验,二者是独立生效的两个校验层面。此外,引入的oauth2-resource-server依赖会触发Spring Boot自动配置相关过滤器,也可能干扰无认证模式的生效。
解决方案
1. 完善Security配置类基础注解
给配置类添加@Configuration和@EnableWebSecurity,确保Spring能识别并加载该配置:
@Configuration @EnableWebSecurity public class DefaultSecurityConfig { // ... 原有Bean方法 }
2. 禁用OAuth2资源服务器自动配置
在noAuthSecurityFilterChain中显式禁用OAuth2资源服务器配置,避免自动配置的过滤器拦截请求:
@Bean @Order(1) @Profile("no-authentication") public SecurityFilterChain noAuthSecurityFilterChain(final HttpSecurity httpSecurity) throws Exception { return httpSecurity .csrf(AbstractHttpConfigurer::disable) .formLogin(AbstractHttpConfigurer::disable) .oauth2ResourceServer(oauth2 -> oauth2.disable()) // 禁用OAuth2资源服务器 .authorizeHttpRequests(auth -> auth.anyRequest().permitAll()) .build(); }
3. 禁用方法级权限校验
针对方法级的@PreAuthorize等注解,有两种处理方式:
方式一:全局允许所有方法调用
添加一个全局方法授权管理器Bean,在no-authentication profile下允许所有方法调用:
@Bean @Profile("no-authentication") public MethodAuthorizationManager methodAuthorizationManager() { return (authentication, invocation) -> AuthorizationDecision.authorized(); }
方式二:关闭方法级注解支持
如果项目中通过@EnableMethodSecurity启用了方法级安全,可在no-authentication profile下单独配置关闭相关注解:
@Configuration @Profile("no-authentication") @EnableMethodSecurity(prePostEnabled = false) // 关闭@PreAuthorize/@PostAuthorize注解 public class NoAuthMethodSecurityConfig { }
4. 激活no-authentication profile
启动应用时确保激活目标profile,可通过以下方式:
- 启动参数:
--spring.profiles.active=no-authentication - 配置文件(application.yml):
spring: profiles: active: no-authentication
内容的提问来源于stack exchange,提问作者Peter Penzov
相关产品推荐
相关产品推荐

