使用 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));
        };
    }

}