You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在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.htmlmain.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()));
}

关键说明:

  1. 为什么用扩展名匹配?
    Angular打包后会生成带有哈希值的资源文件(比如main.abc123.js),直接匹配扩展名能覆盖所有这类文件,不管它们在static根目录还是子目录(比如Angular的assets目录打包后会变成/assets/,上面的规则也能覆盖)。
  2. 不会暴露API吗?
    不会,因为你的API都带有/api/前缀,而上面的规则只匹配带特定扩展名的静态资源,API请求不会被这个规则匹配到,依然会走anyRequest().authenticated()的管控。
  3. 适配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

火山引擎 最新活动