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

如何在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在同一包中。 我正在尝试访问,但正在获取… 怎么了? 问题答案: 编译器应该捕获这样的错误。当您显然在运行时得到此消息时,发生了一些奇怪的事情。可能您已更改了源代码,但已完全重新编译。 另一个潜在但晦涩的问题是通过不同的类加载器加载类。即使包名称相同,从不同的类加载器加载的类也将位于不同的包中(以与由不同的类加载器加

  • 问题内容: 我在理解Java(或其背后的设计)中的受保护的访问修饰符时遇到了一些麻烦。我认为这意味着程序包访问和通过继承包含抽象成员的类的对象的访问。 我编写了以下示例代码。我看到,如果未注释,注释掉的行会产生编译错误。为什么我可以通过Second中的Second对象而不是Second中的First对象访问pro? 问题答案: 该网页链接@MadProgrammer给出了一个体面的解释: “ pr