ComponentScan和SpringSecurity的奇妙化学反应


@SpringBootApplication
@MapperScan("com.cll.jtool.security.mapper")
@ComponentScan("com.cll.jtool.common.util")
public class JtoolSecurityApplication {

    public static void main(String[] args) {
        ConfigurableApplicationContext run = SpringApplication.run(JtoolSecurityApplication.class, args);
    }
}

 @Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
        return http
                //关闭csrf
                .csrf().disable()
                .cors().and()
                //不通过Session获取SecurityContext
                .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)
                .and()
                .authorizeRequests()
                // 对于登录接口 允许匿名访问
                .antMatchers("/user/login").permitAll()
                // 除上面外的所有请求全部需要鉴权认证
                .anyRequest().authenticated().and()
//                .addFilterBefore(jtoolAuthenticationFilter, UsernamePasswordAuthenticationFilter.class)
                .build();
    }
![img](https://img-mid.csdnimg.cn/release/static/image/mid/ask/846679294786199.png "#left")

就加了一个@ComponentScan("com.cll.jtool.common.util"),而且这个包里根本没有和SpringSecurity有关的东西,一旦访问接口就会报403,一旦注释掉这行,我的SecurityConfig就会正常。

在Spring Security中,403 Forbidden错误通常表示用户已经被认证,但是他们没有足够的权限来访问特定的资源。这可能是因为你的Spring Security配置没有正确地设置权限,或者你的用户没有被授予正确的角色或权限。

在你的代码中,你使用了@ComponentScan注解来扫描"com.cll.jtool.common.util"包。这可能会改变Spring的bean加载顺序,从而影响到Spring Security的配置。例如,如果"com.cll.jtool.common.util"包中的某个类被标记为@Configuration,并且它修改了Spring Security的配置,那么这可能会导致403错误。

你可以尝试以下的解决方案:

  1. 检查"com.cll.jtool.common.util"包中的所有类,看看它们是否有可能影响到Spring Security的配置。特别是那些被标记为@Configuration或@Component的类。

  2. 检查你的用户是否被授予了正确的角色或权限。你可以在数据库中查看用户的角色和权限,或者在你的代码中添加一些调试语句来输出用户的角色和权限。

  3. 尝试修改你的Spring Security配置,使其允许所有用户访问所有资源,然后逐步添加权限限制,看看哪一步导致了403错误。

  4. 如果可能,尝试移除@ComponentScan注解,然后手动添加需要的bean到Spring的配置中,看看这是否可以解决问题。

希望这些信息能帮助你解决问题。如果你还有其他问题,欢迎继续提问。

ComponentScan指定扫描包,会导致默认包扫描器失效