spring security踩坑记录(web.ignoring不生效、无法@Autowired注入其他组件)

spring Security版本:1.5.10

1、spring Security的web.ignoring不生效:

原因分析: 自定义过滤器交给了spring IOC管理,所以你在spring Security的config无论怎么配都会走到自己的过滤器。

解决办法: 自定义过滤器不能以bean的形式注入spring IOC,交给容器管理,检查自定义过滤器是否有以@bean、@component、@configuration的形式注入到spring IOC容器,如果有去掉即可。

2、自定义过滤器无法@Autowired注入其他组件:

原因分析: 搜索得知

  1. 在bean初始化之前加载过滤器,所以无法注入。
  2. 自定义过滤器无法以Bean或者组件的形式注入到spring IOC容器,这样会导致问题1,

解决方法: 在spring Security的config中通过构造器注入需要的方法。

以上方法并为通过源码验证,属于个人根据搜索结果的推测,并在代码中得以验证,如有不对的地方,欢迎指正

自定义过滤器MyFilter.java

public class MyFilter implements Filter {

    private static final Logger log = LoggerFactory.getLogger(MyFilter.class);

    RedisService redisService;
    UserFamilyDao userFamilyDao;

    public PermissionCheckFilter(RedisService redisService, UserFamilyDao userFamilyDao){
        this.redisService = redisService;
        this.userFamilyDao = userFamilyDao;
    }

    @Override
    public void init(FilterConfig filterConfig) {
        //无初始化需求
    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {

        //do somethings
        filterChain.doFilter(servletRequest, servletResponse);
    }

    @Override
    public void destroy() {
        // Do nothing because it is Unnecessary.
    }
}

spring Security的config文件:

/**
 * @Author: allen.luan
 * @Description: Spring Security 配置类
 * @Date: 2021.8.10
 */

@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Autowired
    RedisService redisService;
    @Autowired
    UserFamilyDao userFamilyDao;

    @Order(1)
    @Override
    protected void configure(HttpSecurity httpSecurity) throws Exception {
        httpSecurity
                // 禁用 CSRF
                .csrf().disable()
                // 授权异常
                .exceptionHandling()
                // 防止iframe 造成跨域
                .and()
                .headers()
                .disable()
                .authorizeRequests()
                // 不需要认证的接口
                .antMatchers("/app/user/**").permitAll()
                // 所有请求都需要认证
                .anyRequest().authenticated();
        httpSecurity.addFilterBefore(new MyFilter(redisService,userFamilyDao), CsrfFilter.class);
    }

    @Override
    public void configure(WebSecurity web) {
        //放过所有get请求
        web.ignoring().antMatchers(HttpMethod.GET);
        //登陆相关
        web.ignoring().antMatchers("/app/login/**","/app/password");
        //swagger相关接口
        web.ignoring().antMatchers("/swagger-ui.html","/swagger-resources/**","/webjars/**","/*/api-docs");
    }

}

你可能感兴趣的:(开发错误,好文,&&,经验,java,spring,boot)