Skip to content

Commit 82de003

Browse files
authored
Merge pull request #13 from team-gogo/update/server-to-server-api-ip-filtering
[global] internal API의 security IP 필터링 추가
2 parents 4f16e7a + 732546f commit 82de003

File tree

3 files changed

+34
-2
lines changed

3 files changed

+34
-2
lines changed
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package gogo.gogobetting.global.config
2+
3+
import gogo.gogobetting.global.security.SecurityProperties
4+
import org.springframework.boot.context.properties.ConfigurationPropertiesScan
5+
import org.springframework.context.annotation.Configuration
6+
7+
@Configuration
8+
@ConfigurationPropertiesScan(
9+
basePackageClasses = [
10+
SecurityProperties::class
11+
]
12+
)
13+
class PropertiesScanConfig

src/main/kotlin/gogo/gogobetting/global/config/SecurityConfig.kt

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,17 @@ import gogo.gogobetting.global.filter.LoggingFilter
55
import gogo.gogobetting.global.handler.CustomAccessDeniedHandler
66
import gogo.gogobetting.global.handler.CustomAuthenticationEntryPointHandler
77
import gogo.gogobetting.global.internal.user.stub.Authority
8+
import gogo.gogobetting.global.security.SecurityProperties
89
import org.springframework.context.annotation.Bean
910
import org.springframework.context.annotation.Configuration
1011
import org.springframework.http.HttpMethod
12+
import org.springframework.security.authorization.AuthorizationDecision
1113
import org.springframework.security.config.annotation.web.builders.HttpSecurity
1214
import org.springframework.security.config.http.SessionCreationPolicy
1315
import org.springframework.security.web.SecurityFilterChain
16+
import org.springframework.security.web.access.intercept.RequestAuthorizationContext
1417
import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter
18+
import org.springframework.security.web.util.matcher.IpAddressMatcher
1519
import org.springframework.web.cors.CorsConfiguration
1620
import org.springframework.web.cors.CorsConfigurationSource
1721
import org.springframework.web.cors.UrlBasedCorsConfigurationSource
@@ -21,7 +25,8 @@ class SecurityConfig(
2125
private val customAccessDeniedHandler: CustomAccessDeniedHandler,
2226
private val customAuthenticationEntryPointHandler: CustomAuthenticationEntryPointHandler,
2327
private val authenticationFilter: AuthenticationFilter,
24-
private val loggingFilter: LoggingFilter
28+
private val loggingFilter: LoggingFilter,
29+
private val securityProperties: SecurityProperties
2530
) {
2631

2732
@Bean
@@ -57,14 +62,19 @@ class SecurityConfig(
5762
httpRequests.requestMatchers(HttpMethod.POST, "/betting/batch/cancel/{match_id}").hasAnyRole(Authority.USER.name, Authority.STAFF.name)
5863

5964
// server to server
60-
httpRequests.requestMatchers(HttpMethod.GET, "/betting/bundle").permitAll()
65+
httpRequests.requestMatchers(HttpMethod.GET, "/betting/bundle").access { _, context -> hasIpAddress(context) }
6166

6267
httpRequests.anyRequest().denyAll()
6368
}
6469

6570
return http.build()
6671
}
6772

73+
private fun hasIpAddress(context: RequestAuthorizationContext): AuthorizationDecision {
74+
val ALLOWED_IP_ADDRESS_MATCHER = IpAddressMatcher("${securityProperties.serverToServerIp}${securityProperties.serverToServerSubnet}")
75+
return AuthorizationDecision(ALLOWED_IP_ADDRESS_MATCHER.matches(context.request))
76+
}
77+
6878
@Bean
6979
fun corsConfigurationSource(): CorsConfigurationSource {
7080
val configuration = CorsConfiguration()
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
package gogo.gogobetting.global.security
2+
3+
import org.springframework.boot.context.properties.ConfigurationProperties
4+
5+
@ConfigurationProperties(prefix = "security.internal")
6+
class SecurityProperties(
7+
val serverToServerIp: String,
8+
val serverToServerSubnet: String,
9+
)

0 commit comments

Comments
 (0)