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