使用 authorizeHttpRequests 匹配 IP 地址
Matching IP address with authorizeHttpRequests
我在 Spring Security Reference 中读到 AuthorizationFilter 取代了 FilterSecurityInterceptor。所以我正在尝试将我的应用程序迁移到这种更新的方法。
我有类似的东西
http.authorizeRequests()
.mvcMatchers("/")
.hasIpAddress("127.0.0.1")
根据链接页面,我应该可以写出类似
的内容
http.authorizeHttpRequests()
.mvcMatchers("/")
.access("hasIpAddress('127.0.0.1')")
但是没有access(String)
方法。我什至尝试从文档中逐字粘贴代码:
@Bean
SecurityFilterChain web(HttpSecurity http) throws Exception {
http
// ...
.authorizeHttpRequests(authorize -> authorize
.mvcMatchers("/resources/**", "/signup", "/about").permitAll()
.mvcMatchers("/admin/**").hasRole("ADMIN")
.mvcMatchers("/db/**").access("hasRole('ADMIN') and hasRole('DBA')")
.anyRequest().denyAll()
);
return http.build();
}
出于同样的原因无法编译。
这里是编译错误:
Application.java:103:55
java: incompatible types: java.lang.String cannot be converted to org.springframework.security.authorization.AuthorizationManager<org.springframework.security.web.access.intercept.RequestAuthorizationContext>
如何使用带有 IP 地址或字符串表达式的 authorizeHttpRequests?文档有问题吗?
我正在使用 Spring Boot 2.7.0 和 Spring Security 5.7.1
这似乎是文档的问题。目前没有 built-in 实现提供 hasIpAddress(String)
访问检查,但您可以使用 IpAddressMatcher
class 实现能够执行它的 AuthorizationManager
。
这是一个示例配置:
@EnableWebSecurity
public class SecurityConfiguration {
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
http
.authorizeHttpRequests((authorizeRequests) -> authorizeRequests
.mvcMatchers("/").access(hasIpAddress("127.0.0.1"))
.anyRequest().authenticated()
)
.formLogin(Customizer.withDefaults())
.httpBasic(Customizer.withDefaults());
return http.build();
}
private static AuthorizationManager<RequestAuthorizationContext> hasIpAddress(String ipAddress) {
IpAddressMatcher ipAddressMatcher = new IpAddressMatcher(ipAddress);
return (authentication, context) -> {
HttpServletRequest request = context.getRequest();
return new AuthorizationDecision(ipAddressMatcher.matches(request));
};
}
}
我在 Spring Security Reference 中读到 AuthorizationFilter 取代了 FilterSecurityInterceptor。所以我正在尝试将我的应用程序迁移到这种更新的方法。
我有类似的东西
http.authorizeRequests()
.mvcMatchers("/")
.hasIpAddress("127.0.0.1")
根据链接页面,我应该可以写出类似
的内容 http.authorizeHttpRequests()
.mvcMatchers("/")
.access("hasIpAddress('127.0.0.1')")
但是没有access(String)
方法。我什至尝试从文档中逐字粘贴代码:
@Bean
SecurityFilterChain web(HttpSecurity http) throws Exception {
http
// ...
.authorizeHttpRequests(authorize -> authorize
.mvcMatchers("/resources/**", "/signup", "/about").permitAll()
.mvcMatchers("/admin/**").hasRole("ADMIN")
.mvcMatchers("/db/**").access("hasRole('ADMIN') and hasRole('DBA')")
.anyRequest().denyAll()
);
return http.build();
}
出于同样的原因无法编译。
这里是编译错误:
Application.java:103:55
java: incompatible types: java.lang.String cannot be converted to org.springframework.security.authorization.AuthorizationManager<org.springframework.security.web.access.intercept.RequestAuthorizationContext>
如何使用带有 IP 地址或字符串表达式的 authorizeHttpRequests?文档有问题吗?
我正在使用 Spring Boot 2.7.0 和 Spring Security 5.7.1
这似乎是文档的问题。目前没有 built-in 实现提供 hasIpAddress(String)
访问检查,但您可以使用 IpAddressMatcher
class 实现能够执行它的 AuthorizationManager
。
这是一个示例配置:
@EnableWebSecurity
public class SecurityConfiguration {
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
http
.authorizeHttpRequests((authorizeRequests) -> authorizeRequests
.mvcMatchers("/").access(hasIpAddress("127.0.0.1"))
.anyRequest().authenticated()
)
.formLogin(Customizer.withDefaults())
.httpBasic(Customizer.withDefaults());
return http.build();
}
private static AuthorizationManager<RequestAuthorizationContext> hasIpAddress(String ipAddress) {
IpAddressMatcher ipAddressMatcher = new IpAddressMatcher(ipAddress);
return (authentication, context) -> {
HttpServletRequest request = context.getRequest();
return new AuthorizationDecision(ipAddressMatcher.matches(request));
};
}
}