如何在Spring Boot 2.1.1中配置Spring Security允许静态文件夹所有资源访问?
解决Spring Boot Security下Angular静态资源401未授权问题(无需修改Angular路径)
我太懂你的困扰了:想让Spring Security牢牢守住API接口,同时直接访问放在src/main/resources/static根目录下的Angular打包资源,还不想动Angular的路径配置。问题出在你当前用的PathRequest.toStaticResources().atCommonLocations()——这个方法只匹配Spring Boot默认的静态资源子目录(比如/css/、/js/、/images/),但你的Angular资源是直接放在static根目录下的(比如index.html、main.xxx.js这些),所以这条规则根本覆盖不到它们,导致这些资源被拦截返回401。
下面给你适配Spring Boot 2.1.1的解决方案,完全不需要改Angular的href路径:
修改Spring Security的configure(HttpSecurity http)方法
直接添加针对静态资源扩展名的匹配规则,明确允许所有常见的Angular打包资源类型访问,同时保留API的安全管控:
@Override protected void configure(HttpSecurity http) throws Exception { http.csrf().disable() .cors() .and() .exceptionHandling().authenticationEntryPoint(new HttpStatusEntryPoint(HttpStatus.UNAUTHORIZED)) .and() .authorizeRequests() // 允许所有Angular打包生成的静态资源(包括根目录下的) .antMatchers("/**/*.js", "/**/*.css", "/**/*.html", "/**/*.svg", "/**/*.ico", "/**/*.woff2", "/**/*.woff", "/**/*.ttf", "/**/*.map").permitAll() // 保留登录接口的匿名访问权限 .antMatchers("/api/v1/login/").permitAll() // 所有其他请求(主要是API)必须认证 .anyRequest().authenticated() .and() .addFilter(getJWTAuthenticationFilter(authenticationManager())) .addFilter(new JWTAuthorizationFilter(authenticationManager())); }
关键说明:
- 为什么用扩展名匹配?
Angular打包后会生成带有哈希值的资源文件(比如main.abc123.js),直接匹配扩展名能覆盖所有这类文件,不管它们在static根目录还是子目录(比如Angular的assets目录打包后会变成/assets/,上面的规则也能覆盖)。 - 不会暴露API吗?
不会,因为你的API都带有/api/前缀,而上面的规则只匹配带特定扩展名的静态资源,API请求不会被这个规则匹配到,依然会走anyRequest().authenticated()的管控。 - 适配Spring Boot 2.1.x
这个版本的antMatchers支持这种多路径匹配写法,完全兼容你的版本。
额外确认点
确保Angular的angular.json里的build配置中,baseHref设置为"/"(默认就是这个值),这样Angular生成的资源引用都是根路径,和Spring Boot的静态资源映射规则完全匹配,不需要任何修改:
"build": { "builder": "@angular-devkit/build-angular:browser", "options": { "baseHref": "/", // 其他配置... } }
这样配置后,你启动Spring Boot应用时,Angular的index.html和所有关联的静态资源都会被允许匿名访问,而/api/开头的接口依然受Spring Security保护,完美解决你的问题。
内容的提问来源于stack exchange,提问作者Srajan Soni




