spring安全验证逻辑

r6l8ljro  于 2021-07-26  发布在  Java
关注(0)|答案(1)|浏览(301)

SpringSecurity中的端点安全性是通过过滤器列表实现的。我需要澄清一下。
假设一个过滤器已经成功地对一个请求进行了身份验证,并在安全上下文中设置了身份验证对象。这个过滤器也被称为filterchain.dofilter()。假设authentication.isauthenticated()返回true-筛选器已经设置了它。
如果安全上下文中的身份验证对象在调用isauthenticated()时返回true,则后续筛选器是否会忽略身份验证过程(意味着它们不会调用authenticationmanager.authenticate())?或者,即使isauthenticated()在从安全上下文检索到的身份验证对象上返回true,它们仍然会调用authenticationmanager.authenticate()吗?假设请求路径与过滤器配置匹配(这意味着后续过滤器也将看到请求,因为请求servlet路径与它们的配置匹配)
提前谢谢。

y1aodyip

y1aodyip1#

我会尽量详细地回答。
首先,springsecurity确实使用了一个过滤器链,但是通常,身份验证是从链中的一个过滤器开始的。如果以多种方式对用户进行身份验证,则需要实现多个身份验证提供程序(authenticationprovider)。看看图1。身份验证从过滤器级别开始,由名为authenticationmanager的管理器负责。管理器会找到适合的authenticationprovider。图1
在某些情况下,可能需要实现多个身份验证筛选器。假设您有一个自定义的多因素身份验证(mfa)解决方案。但是你决定跳过哪些过滤器。默认情况下,请求遵循链中的每个过滤器。
如果实现onceperrequestfilter并重写shouldnotfilter()方法以告知筛选器何时不应用,则可以将筛选器设计为跳过。
总之:
要以多种方式实现身份验证,请使用身份验证提供程序
后续过滤器将看到该请求,除非您显式地让它们跳过它
我还向您推荐我写的关于Spring Security 的书的第一部分:Spring Security 在行动。您将看到有关身份验证、授权和过滤器链如何工作的更详细的描述。

相关问题