如果我想通过 Spring Boot 提供静态 React 构建文件,我应该如何设置我的 WebSecurityConfig antMatcher 以允许所有前端路由器 URL
How should I set my WebSecurityConfig antMatcher to permit all frontend Router URL if I want to serve static React build files through Spring Boot
我将我的 React 构建文件夹导出到 SpringBoot 资源文件夹,并希望静态地为它们提供服务。我为我的后端端点设置了 antMatcher 以允许某些 urls 访问,
其余 url 是不允许的,需要进行一些身份验证。
http
.cors().and()
.csrf().disable()
.authorizeRequests()
.antMatchers("/api/v1/registration","/api/v1/login")
.permitAll()
.anyRequest()
.authenticated().and()
.exceptionHandling().and()
.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS);
http.addFilterBefore(jwtFilter, UsernamePasswordAuthenticationFilter.class);
目前的情况是,我的前端React RouterURL也被antMatcher屏蔽了
例如
http://localhost:8080/login being blocked
我可以通过手动将前端 url 硬编码到 antMatchers 中来解决它,比如
.antMatchers("/api/v1/registration","/api/v1/login", "/login","/registration"...)
.permitAll()
但我想知道是否有任何优雅的方式告诉后端不要阻塞前端url?如果网站越来越大,在 antMatcher 中添加 URL 会很耗时。
首先,我们要思考一些基本原则:
- 您的网络服务器可能有一些应该对所有人开放的文件(例如
robots.txt
和 favicon.ico
),位于静态前端之上(可能需要也可能不需要 public 不考虑这个)。
- 在配置安全性时,最好有一个基线,即拒绝所有请求,然后将您想要允许通过的请求列入白名单,而不是允许除了您拒绝的少数请求之外的所有请求。以这种方式更容易忘记路径并意外允许访问应受限制的内容。
- 通常使用开放的静态前端,敏感内容由 api 提供动态内容的端点提供(当然,在服务器上呈现的动态前端不是这种情况)。
我喜欢的一种方法是为不同的组使用多个有序配置。据我所知,这不能通过一种配置那么容易地完成,而且由于复杂性也是安全的敌人,这是我喜欢的一种方法:
@EnableWebSecurity(debug = true)
@Order(1)
class OpenConfig: WebSecurityConfigurerAdapter() {
override fun configure(http: HttpSecurity) {
http
.requestMatchers()
.antMatchers("/*", "/locales", "/avatars", "robots.txt")
.and()
.authorizeRequests()
.anyRequest()
.permitAll()
}
}
@EnableWebSecurity
@Order(2)
class RestrictedConfig: WebSecurityConfigurerAdapter() {
override fun configure(http: HttpSecurity) {
http
.requestMatchers()
.antMatchers("/api/**")
.and()
.authorizeRequests()
// more fine-grained control within matched group of requests here
.anyRequest()
.authenticated()
.and()
.httpBasic()
}
}
@EnableWebSecurity
@Order(3)
class CatchAllConfig: WebSecurityConfigurerAdapter() {
override fun configure(http: HttpSecurity) {
http
.authorizeRequests()
.anyRequest()
.denyAll()
}
}
使用 .requestMatchers()
您可以确定要在此配置中处理哪些请求,在 .authorizeRequests()
之后,您可以更详细地确定要对匹配的请求执行的操作。如果省略 .requestMatchers()
(或类似的方法),则所有请求都由配置匹配。将按顺序查找配置,并使用第一个与相关请求匹配的配置。
你可以用一种配置做类似于上面的事情,但我认为将它分成多个配置时更容易从结构上考虑它,而且 Spring 安全性似乎表现得更一致(一旦你涉及身份验证方法,如果您尝试以多种不同的方式控制路径,您在 .authorizeRequests()
之后的选择有时可能无法获得预期的结果。
如果你想以最安全的方式做到这一点,那么你应该明确地将你想要 public 访问的每个静态资产列入白名单,但考虑到你不时地用新的哈希重建前端附加到文件名,这变得乏味。以上是一种中间方式,您假设 /
下一级的所有内容都属于静态前端,因此无需身份验证即可使用(如果需要,您可以在此处使用文件后缀作为补充)。必须明确指定静态前端下的任何文件夹。您现在要做的就是确保将任何动态内容放置在某个安全的路径中,并且您没有任何包会自动将路径添加到您的应用程序中,而您不想打开这些路径并已添加这些路径在根目录(通常是 Swagger UI 和执行器可以做到这一点,即使后者经常将它们放在 /actuator/
路径下。
我将我的 React 构建文件夹导出到 SpringBoot 资源文件夹,并希望静态地为它们提供服务。我为我的后端端点设置了 antMatcher 以允许某些 urls 访问, 其余 url 是不允许的,需要进行一些身份验证。
http
.cors().and()
.csrf().disable()
.authorizeRequests()
.antMatchers("/api/v1/registration","/api/v1/login")
.permitAll()
.anyRequest()
.authenticated().and()
.exceptionHandling().and()
.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS);
http.addFilterBefore(jwtFilter, UsernamePasswordAuthenticationFilter.class);
目前的情况是,我的前端React RouterURL也被antMatcher屏蔽了
例如 http://localhost:8080/login being blocked
我可以通过手动将前端 url 硬编码到 antMatchers 中来解决它,比如
.antMatchers("/api/v1/registration","/api/v1/login", "/login","/registration"...)
.permitAll()
但我想知道是否有任何优雅的方式告诉后端不要阻塞前端url?如果网站越来越大,在 antMatcher 中添加 URL 会很耗时。
首先,我们要思考一些基本原则:
- 您的网络服务器可能有一些应该对所有人开放的文件(例如
robots.txt
和favicon.ico
),位于静态前端之上(可能需要也可能不需要 public 不考虑这个)。 - 在配置安全性时,最好有一个基线,即拒绝所有请求,然后将您想要允许通过的请求列入白名单,而不是允许除了您拒绝的少数请求之外的所有请求。以这种方式更容易忘记路径并意外允许访问应受限制的内容。
- 通常使用开放的静态前端,敏感内容由 api 提供动态内容的端点提供(当然,在服务器上呈现的动态前端不是这种情况)。
我喜欢的一种方法是为不同的组使用多个有序配置。据我所知,这不能通过一种配置那么容易地完成,而且由于复杂性也是安全的敌人,这是我喜欢的一种方法:
@EnableWebSecurity(debug = true)
@Order(1)
class OpenConfig: WebSecurityConfigurerAdapter() {
override fun configure(http: HttpSecurity) {
http
.requestMatchers()
.antMatchers("/*", "/locales", "/avatars", "robots.txt")
.and()
.authorizeRequests()
.anyRequest()
.permitAll()
}
}
@EnableWebSecurity
@Order(2)
class RestrictedConfig: WebSecurityConfigurerAdapter() {
override fun configure(http: HttpSecurity) {
http
.requestMatchers()
.antMatchers("/api/**")
.and()
.authorizeRequests()
// more fine-grained control within matched group of requests here
.anyRequest()
.authenticated()
.and()
.httpBasic()
}
}
@EnableWebSecurity
@Order(3)
class CatchAllConfig: WebSecurityConfigurerAdapter() {
override fun configure(http: HttpSecurity) {
http
.authorizeRequests()
.anyRequest()
.denyAll()
}
}
使用 .requestMatchers()
您可以确定要在此配置中处理哪些请求,在 .authorizeRequests()
之后,您可以更详细地确定要对匹配的请求执行的操作。如果省略 .requestMatchers()
(或类似的方法),则所有请求都由配置匹配。将按顺序查找配置,并使用第一个与相关请求匹配的配置。
你可以用一种配置做类似于上面的事情,但我认为将它分成多个配置时更容易从结构上考虑它,而且 Spring 安全性似乎表现得更一致(一旦你涉及身份验证方法,如果您尝试以多种不同的方式控制路径,您在 .authorizeRequests()
之后的选择有时可能无法获得预期的结果。
如果你想以最安全的方式做到这一点,那么你应该明确地将你想要 public 访问的每个静态资产列入白名单,但考虑到你不时地用新的哈希重建前端附加到文件名,这变得乏味。以上是一种中间方式,您假设 /
下一级的所有内容都属于静态前端,因此无需身份验证即可使用(如果需要,您可以在此处使用文件后缀作为补充)。必须明确指定静态前端下的任何文件夹。您现在要做的就是确保将任何动态内容放置在某个安全的路径中,并且您没有任何包会自动将路径添加到您的应用程序中,而您不想打开这些路径并已添加这些路径在根目录(通常是 Swagger UI 和执行器可以做到这一点,即使后者经常将它们放在 /actuator/
路径下。