HttpSecurity permitAll 和 WebSecurity 忽略 un-Auth URL 的功能?

Posted

技术标签:

【中文标题】HttpSecurity permitAll 和 WebSecurity 忽略 un-Auth URL 的功能?【英文标题】:HttpSecurity permitAll and WebSecurity ignoring functions for un-Auth URL's? 【发布时间】:2020-10-21 22:14:50 【问题描述】:

这个问题可能看起来是重复的,但以下答案都没有解释何时使用:

`http
   .authorizeRequests()
   .antMatchers("/h2-console/**", "/user/register/**").permitAll()` 

`web
   .ignoring()
   .antMatchers("/h2-console/**", "/user/register/**")`
    HttpSecurity, WebSecurity and AuthenticationManagerBuilder Difference between Web ignoring and Http permitting in Spring Security?

通过 *** asnwers 和几篇文章,我了解到:

configure(HttpSecurity) 允许在资源级别配置基于 Web 的安全性。

configure(WebSecurity) 用于影响全局安全的配置设置。使用此 URL 从 Spring Security Filter Chain 中完全忽略。

当我使用 permitAll() 时,它只有在我禁用 csrf 时才有效:http.csrf().disable() 因为 Spring Security 过滤器链仍然处于活动状态。

但是web.ignoring() URL 被完全忽略。

还有很多文章使用http.permitAll() 代替/login/register,例如like this one 和this

所以我想了解,

为什么我们甚至应该使用 http.permitAll() 来处理像 /login/register 这样的 Un-Auth URL?

为什么我们不能将web.ignoring() 用于/login/register

为什么 web.ignoring() 通常仅用于提供静态内容,例如 csswebjars 等,但不适用于 /login/register

【问题讨论】:

当您permitAll 时,您基本上会说不管我希望每个人都能够访问此 URL,但是所有其他安全功能(安全标头、csrf 保护等)仍然适用。使用ignoring,所有这些功能也会被忽略并打开您的应用程序以发现可能存在的漏洞。 感谢您的回复。我想了解这些漏洞。我的意思是,如果我希望 URL 未经身份验证,那么仍然存在哪些安全漏洞?这将帮助我理解并决定在未来的场景中哪个URLS应该是web.ignored(),哪个应该是http.permitAll() 跨站脚本、XSS 攻击、内容嗅探等等。 Spring Security 具有防止这些情况的功能(并通过发送额外的标头在浏览器中启用它们)。 Spring Security 做的不仅仅是“只是”身份验证和授权。忽略它们也意味着没有设置安全上下文等。 【参考方案1】:

正如@M. Deinum 指出的那样,我正在总结答案,我已经更新了PR 中的相同文档。

configure(WebSecurity web)

此方法中使用的端点忽略了弹簧安全过滤器, 标头、CSRF 等。请参阅 HeadersConfigurer、CsrfConfigurer。相反,如果 您想保护公共端点免受常见漏洞的影响, 然后查看configure(HttpSecurity)HttpSecurity#authorizeRequests配置方法。

configure(HttpSecurity http)

需要防御常见漏洞的公共端点 可以在这里指定。请参阅HttpSecurity#authorizeRequestspermitAll()授权规则了解更多详情。

【讨论】:

以上是关于HttpSecurity permitAll 和 WebSecurity 忽略 un-Auth URL 的功能?的主要内容,如果未能解决你的问题,请参考以下文章

spring security login csrf 失效问题

Spring Security中permitAll()和anonymous()的区别

Spring Security 使用 HttpSecurity 对 url 和方法的请求进行授权

access="permitAll" 和 filters="none" 的区别?

尽管 authorizeRequests().anyRequest().permitAll() spring-security 返回 401

带有 permitAll() 和过期身份验证令牌的 URL 的 Spring Security