Spring Security 中 Web 忽略和 Http 允许之间的区别?

D.T*_*mov 8 java spring spring-mvc spring-security spring-boot

这两种方法有什么区别?

 @Override
protected void configure(HttpSecurity http) throws Exception {
    http.authorizeRequests().antMatchers("/api/**").permitAll();
}

@Override
public void configure(WebSecurity web) {
    web.ignoring().antMatchers("/api/**");
}
Run Code Online (Sandbox Code Playgroud)

在 spring 安全配置类中,当我使用 HttpSecurity 时,它仍然给我 403 禁止,但是当我使用 WebSecurity 时,它通过得很好?这是为什么?我觉得我几乎无法控制什么是允许的,什么是需要通过过滤器授权的。

Nik*_*las 9

我建议您浏览一下这篇文章:Spring Security Java Config Preview: Web Security您的代码中两种方法之间的区别是:

  • HttpSecurity允许为 HTTP 请求配置基于 Web 的安全性。在此级别,您声明身份验证规则。
  • WebSecurity允许配置对所有 Web 安全具有全局影响的内容,例如设置调试模式或使用 的实现启用进一步的防火墙配置,HttpFirewall或者简单地忽略代码所示的资源。

configure您可能对第三种方法感兴趣,WebSecurityConfigurerAdapter该方法使用:

  • 为什么 PermitAll() 不能消除匹配端点上的所有身份验证需求?如果我有一个端点,可以说 /api/countries 我希望无需任何过滤(身份验证/授权)即可访问它。为什么 PermitAll() 不能处理它?我不得不采取忽视的方式。 (5认同)

And*_*sha 8

这是一个有点抽象的问题,也有一个有点抽象的答案。

  1. [流程1]想象一下一座大型办公楼,底层有一个主要接待处,底层的接待处可以让你进入大楼,如果你想去公司,假设B他们会带你去那里,但他们不能让你进入任何公司的办公室,因为他们很诚实,每个办公室都有自己的接待处,当你来到B办公室接待处时,你需要在那里进行身份验证(只是访客,匿名人士想要查看他们的信息)办公室、工人/用户、管理员等...),这仅取决于他们是否让您进入任何父亲。

  2. [流程2]再想象一下,在同一栋大写字楼里有餐厅/商店/厕所,当你来到一楼的主要接待处并询问他们餐厅在哪里时,他们会带你去那里,你不应该在这里进行身份验证,他们不知道您是谁,也不应该:web.ignoring().antMatchers("/restaurant/**");

  3. [流程3]想象一下,在同一栋大办公楼里,有一家C公司决定在他们的楼层开设画廊(在一个房间,而不是在整个办公室)

    • 他们询问一楼的主接待处“如果有人要来看我们的画廊,就让他们进去,无需经过我们接待处的验证”web.ignoring().antMatchers("/C/gallery/**");
    • 他们也可以采取其他方式处理流程1,当人们来到他们的接待台并说他想参观他们的画廊时,他们只会让他们进入而无需身份验证http.authorizeRequests().antMatchers("/C/gallery/**").permitAll();

    在这两种情况下,结果是相同的,访问者将看到C公司的画廊,但在流程中http涉及许多步骤/人员/(案例中的过滤器Spring Security) - 它有点慢并且不需要静态资源。

主要接待处位于一楼 -WebSecurity它只是整个应用程序/建筑中的一个。

任何公司的接待处WebSecurityConfigurerAdapter(每个公司WebSecurityConfigurerAdapter只有一个HttpSecurity)您可以拥有任意数量的接待处,并且每个接待处都可能具有完全独立的身份验证流程、安全要求等......,但所有这些接待处都可以要求WebSecurity授予对某些内容的访问权限无需任何身份验证即可将资源提供给任何人。WebSecurity甚至不知道如何验证用户身份 - 没有这样的选项。

总结你的问题,这两种方法应该给出相同的效果,如果不是,那就意味着有一些额外的配置(默认情况下 ex crsf 等),默认情况下WebSecurityConfigurerAdapter也改变行为,它捕获安全异常并返回适当的状态(401 ,403)。为了给您更好的答案,您应该提供更多详细信息。仅使用您显示的配置创建新项目,禁用.WebSecurityConfigurerAdapterExceptionTranslationFilterhttp.csrf().disable()