当前位置: 首页 > 知识库问答 >
问题:

如何在Spring Security中保护受ip地址限制的匿名访问?

曾河
2023-03-14

我想允许对URL的匿名访问,仅限于特定的IP地址子网。

网址是:

http://10.102.34.98:880/auth/tokens/revoke/blabla 其中 auth 是 Web 应用的上下文根。

访问IP地址10.102.34.98访问IP地址的子网掩码255.255.255.0trusted.client.subnet属性设置为10.102.34.0/24

匿名访问工作正常:

protected void configure(HttpSecurity http) throws Exception {
    http
        .csrf().disable()
        .requestMatchers()
            .antMatchers("/login", "/oauth/authorize","/tokens/revoke/**")
            .and()
        .authorizeRequests()
            .antMatchers("/tokens/revoke/**").permitAll()
            .and()
        .authorizeRequests()
            .anyRequest().authenticated()
            .and()
        .formLogin()
            .loginPage("/login")
            .permitAll();
}

但是,一旦我将permitAll()替换为hasIpAddress(),我就会被重定向到我的登录页面。

如何允许受IP地址子网限制的匿名访问?

protected void configure(HttpSecurity http) throws Exception {
    http
        .csrf().disable()
        .requestMatchers()
            .antMatchers("/login", "/oauth/authorize","/tokens/revoke/**")
            .and()
        .authorizeRequests() 
            .antMatchers("/tokens/revoke/**").hasIpAddress(environment.getProperty("trusted.client.subnet"))
            .and()
        .authorizeRequests()
            .anyRequest().authenticated()
            .and()
        .formLogin()
            .loginPage("/login")
            .permitAll();
}

更新1:

是最后的这段代码强制显示登录表单。我希望它不会将其带入accont,因为它已经通过了IP地址白名单。

    .and()
    .authorizeRequests()
        .anyRequest().authenticated()
        .and()
    .formLogin()
        .loginPage("/login")
        .permitAll();

共有1个答案

冯星剑
2023-03-14

您应该通过启用Spring Security日志获得更多信息:

-Dlogging.level.org.springframework.security=TRACE

最有可能的是,正在发生的事情是,一个 hasIpAddress 匹配,ROLE_ANONYMOUS角色被赋予发出请求的用户。除非在安全配置中启用了 anonymous(),否则不会启用该角色。

请参阅以下其他问题:

  • Spring Security在rest服务中获取用户信息,用于已验证和未验证的用户。
  • Spring Security permitAll()不允许匿名访问
 类似资料:
  • 假设我有一个抽象类: 使用方法如下: 这段代码在编译时失败,这是意料之中的。 但以下代码编译成功,这似乎令人惊讶: 不同之处在于,在后一种情况下,我访问的方法没有命名引用。为什么编译器允许这样的访问?

  • 我已经实现了自己的,我想在类声明之外调用它的方法,但是错误显示:updateProgress(double,double)在任务中具有受保护的访问权限

  • 我有两个不同包的亲子班。我正在重写受保护类型的方法。我想访问子类中的超类保护方法。 考虑以下代码: 认为我是Java新手,并在main方法中提供替代comment的答案。

  • 问题内容: 我想知道Android设备的IP地址是数据IP还是Wifi IP。 1)首先将设备连接到3G,然后将设备分配给网络IP。 2)之后将设备连接到WIFI,现在该设备将分配给WIFI IP。 3)任何可以让我们知道IP地址是Wifi IP地址还是网络IP的Android API? 在2.3.5中使用了下面的代码,一切都很好,但是在4.0.3中,ICS存在一些问题。 请帮助 4)当我关闭移动

  • 问题内容: 我有两节课。 类具有受保护的方法,是的实例。 Class 与class在同一包中。 我正在尝试访问,但正在获取… 怎么了? 问题答案: 编译器应该捕获这样的错误。当您显然在运行时得到此消息时,发生了一些奇怪的事情。可能您已更改了源代码,但已完全重新编译。 另一个潜在但晦涩的问题是通过不同的类加载器加载类。即使包名称相同,从不同的类加载器加载的类也将位于不同的包中(以与由不同的类加载器加

  • 问题内容: 验证用户输入的IP有效的最佳方法是什么?它以字符串形式出现。 问题答案: 不要解析它。只是问问。