如何阻止Spring Security通过引用访问实体并解决React静态资源401问题
解决方案
核心思路是把后端接口和静态资源路径做明确隔离,所有后端接口统一使用/api前缀,这样就可以批量放行所有非/api前缀的静态资源/前端路由,同时保证所有接口的权限控制生效。
步骤1:统一后端接口前缀
确保所有后端接口都以/api开头,避免漏配导致接口暴露,推荐用全局配置自动添加前缀,无需手动修改每个Controller:
在你现有的MvcSecurityConfig类中添加如下方法,自动给所有@RestController注解的接口加上/api前缀:
@Override public void configurePathMatch(PathMatchConfigurer configurer) { // 所有@RestController类的接口自动添加/api前缀 configurer.addPathPrefix("/api", clazz -> clazz.isAnnotationPresent(RestController.class)); }
如果你已经手动给部分接口加了/api前缀,把那部分手动前缀删掉即可,避免重复。
步骤2:修改Spring Security配置
调整权限匹配规则,先匹配接口权限,剩余所有非接口请求全部放行,修改WebSecurityConfig类的configure方法如下:
@Override protected void configure(HttpSecurity http) throws Exception { http.cors().and().csrf().disable() .exceptionHandling().authenticationEntryPoint(unauthorizedHandler).and() .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS).and() .authorizeRequests() // 放行公开的接口 .antMatchers("/api/auth/**", "/api/test/**").permitAll() // 其余所有/api开头的接口必须认证后访问 .antMatchers("/api/**").authenticated() // 保留管理员路径权限控制(如果是前端路由也可以移到前端做权限校验) .antMatchers("/admin").hasRole("ADMIN") // 剩余所有非/api开头的请求(静态资源、前端路由)全部放行 .anyRequest().permitAll(); http.addFilterBefore(authenticationJwtTokenFilter(), UsernamePasswordAuthenticationFilter.class); }
验证效果
- 所有React静态资源、前端路由都可以直接访问,不会被Security拦截,无需再手动添加路径放行规则
- 所有后端接口都以
/api开头,除了公开接口外都需要认证,不会出现未授权访问数据表接口的问题
内容的提问来源于stack exchange,提问作者Джейк Морган
相关产品推荐
相关产品推荐

