You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

配置禁用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 10:25:18