尘同学 2023-07-21 11:36 采纳率: 100%
浏览 30
已结题

重写FilterSecurityInterceptor 报错An AccessDecisionManager is required

新建类 customFilterSecurityInterceptor ,重写FilterSecurityInterceptor 拦截器,,项目启动报错:
org.springframework.context.ApplicationContextException: Unable to start web server; nested exception is org.springframework.boot.web.server.WebServerException: Unable to start embedded Tomcat

Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'customFilterSecurityInterceptor' defined in file [D:\project\zuoye\gowin-admin\admin-common\target\classes\com\itutorgroup\admin\common\config\CustomFilterSecurityInterceptor.class]: Invocation of init method failed; nested exception is java.lang.IllegalArgumentException: An AccessDecisionManager is required


```java
@Component
@Slf4j
public class CustomFilterSecurityInterceptor extends FilterSecurityInterceptor {

    @Resource
    private AccessDecisionManager accessDecisionManager;

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        System.out.println("------------333333-----------3333333333333-------------------------------------");
        log.info("------------333333-----------3333333333333-------------------------------------");
        super.doFilter(request, response, chain);
    }

    @Override
    public void afterPropertiesSet() {
        super.afterPropertiesSet();
        setAccessDecisionManager(accessDecisionManager);
    }

在WebSecurityConfigurerAdapter  里面也添加了AccessDecisionManager 不生效

 @Order(1)
@Slf4j
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
  @Resource
    private AccessDecisionManager accessDecisionManager;
  @Override   
    protected void configure(HttpSecurity http) throws Exception {

        System.out.println("------------0000000000-----------00000000000000000000-------------------------------------");
       log.info("------------0000000000-----------00000000000000000000-------------------------------------");

        http.authorizeRequests().accessDecisionManager(accessDecisionManager)
                .antMatchers("/api/captcha/get/**").permitAll()
                .anyRequest().authenticated()
                .and().formLogin().permitAll()
                .and().csrf().disable();

        http.addFilterBefore(customFilterSecurityInterceptor, FilterSecurityInterceptor.class);
    }

我尝试了很多种加AccessDecisionManager ,还是不行,SecurityConfig的 方法 configure 和 CustomFilterSecurityInterceptor的方法doFilter
没有sysout打印和log,info打印

版本包信息如下:

![img](https://img-mid.csdnimg.cn/release/static/image/mid/ask/61472501998615.png "#left")

折腾了一天了,想不通,求解答
  • 写回答

1条回答 默认 最新

  • kse_music 2023-07-24 11:27
    关注

    直接通过对象后置处理器更改FilterSecurityInterceptor 的配置就行了

    public class SecurityConfig extends WebSecurityConfigurerAdapter {
    
        @Override
        protected void configure(HttpSecurity http) throws Exception {
    
            System.out.println("------------0000000000-----------00000000000000000000-------------------------------------");
            log.info("------------0000000000-----------00000000000000000000-------------------------------------");
            http.authorizeRequests().withObjectPostProcessor(new ObjectPostProcessor<FilterSecurityInterceptor>() {
                        @Override
                        public <O extends FilterSecurityInterceptor> O postProcess(O object) {
                            FilterSecurityInterceptor securityInterceptor = object;
                            //更改相关配置
    //                        securityInterceptor.setSecurityMetadataSource();
    //                        securityInterceptor.setAccessDecisionManager();
    //                        securityInterceptor.setAuthenticationManager();
                            return object;
                        }
                    })
                    .antMatchers("/api/captcha/get/**").permitAll()
                    .anyRequest().authenticated()
                    .and().formLogin().permitAll()
                    .and().csrf().disable();
    
        }
    
    }
    
    

    如果非要完全使用自己的FilterSecurityInterceptor ,也可以在对象后置处理器直接返回自己FilterSecurityInterceptor 实例

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 8月2日
  • 已采纳回答 7月25日
  • 创建了问题 7月21日

悬赏问题

  • ¥15 求一份STM32F10X的I2S外设库
  • ¥15 android 打包报错
  • ¥15 关于stm32的问题
  • ¥15 ncode振动疲劳分析中,noisefloor如何影响PSD函数?
  • ¥50 寻找fpga的benchmark
  • ¥50 如何在arduino上,实现用4×4矩阵键盘按键控制2004显示屏输出图中显示功能的代码?
  • ¥15 P1口接8个发光二极管,利用定时计数器1编写程序
  • ¥20 keil5编译找不到.h文件该如何解决
  • ¥15 安卓EVS如何开启服务正常实现功能
  • ¥15 canal读取mysql时报错