文章插图
ProviderManager Parent介绍
事实上,多个ProviderManager实例可能共享相同的父AuthenticationManager 。这在多个SecurityFilterChain实例具有某些共同身份验证(共享的父类AuthenticationManager)和不同身份验证机制(不同的ProviderManager实例)的场景中有些常见 。
文章插图
多个ProviderManager 同一个Parent 介绍
默认情况下,ProviderManager将尝试从成功的身份验证请求返回的Authentication对象中清除任何敏感凭证信息 。这可以防止密码等信息在HttpSession中保留的时间超过必要时间
当您使用用户对象的缓存(例如,在无状态应用程序中提高性能)时,这可能会导致问题 。如果Authentication包含对缓存中的对象(如UserDetails实例)的引用,并且该引用已删除其凭证,那么将不再能够根据缓存的值进行身份验证 。如果您正在使用缓存,则需要考虑到这一点 。一个明显的解决方案是,首先在缓存实现中或在创建返回的Authentication对象的AuthenticationProvider中复制一个对象 。或者,您可以禁用ProviderManager上的
eraseCredentialsAfterAuthentication属性
AuthenticationProvider多个AuthenticationProviders可以被注入到ProviderManager中 。每个AuthenticationProvider执行特定类型的身份验证 。例如,DaoAuthenticationProvider支持基于用户名/密码的身份验证,而JwtAuthenticationProvider支持验证JWT令牌 。
使用AuthenticationEntryPoint请求凭证AuthenticationEntryPoint用于从客户端发送一个HTTP响应请求凭证 。有时客户端将主动包括凭证,例如请求资源的用户名/密码 。在这些情况下,Spring Security不需要提供从客户端请求凭证的HTTP响应,因为它们已经包含在其中了 。
在其他情况下,客户端将向未被授权访问的资源发出未经身份验证的请求 。在本例中,AuthenticationEntryPoint的实现用于客户端的请求凭证 。AuthenticationEntryPoint实现可能执行重定向到一个登录页面,响应一个WWW-Authenticate头,等等 。
AbstractAuthenticationProcessingFilter
AbstractAuthenticationProcessingFilter被用作验证用户凭据的基本过滤器 。在验证凭证之前,Spring Security通常使用AuthenticationEntryPoint请求凭证 。接下来,AbstractAuthenticationProcessingFilter可以验证提交给它的任何身份验证请求 。
文章插图
文章插图
AbstractAuthenticationProcessingFilter 介绍
①当用户提交他们的凭证时,
AbstractAuthenticationProcessingFilter从HttpServletRequest创建一个Authentication来进行身份验证 。创建的身份验证类型依赖于AbstractAuthenticationProcessingFilter的子类 。例如,UsernamePasswordAuthenticationFilter从HttpServletRequest中提交的用户名和密码创建UsernamePasswordAuthenticationToken 。
②接下来,将Authentication传递给AuthenticationManager进行身份验证 。
③如果身份验证失败,则失败:
- 清除SecurityContextHolder 。
- RememberMeServices.loginFail被调用 。请记住我没有配置,这是不允许操作的 。
- AuthenticationFailureHandler被调用 。
- SessionAuthenticationStrategy会在新登录时得到通知 。
- Authentication在SecurityContextHolder上设置 。稍后,securitycontextpersistencfilter将SecurityContext保存到HttpSession 。
- RememberMeServices.loginSuccess被调用 。请记住我没有配置,这是不允许操作的 。
- ApplicationEventPublisher发布一个InteractiveAuthenticationSuccessEvent 。
- AuthenticationSuccessHandler被调用 。
读取用户名和密码
Spring Security提供了以下内置机制来从HttpServletRequest读取用户名和密码:
- 表单登录
- 基本身份验证
- 摘要式身份验证
每种受支持的读取用户名和密码的机制都可以利用任何受支持的存储机制:
- 使用内存身份验证的简单存储
- 使用JDBC身份验证的关系数据库
- 使用UserDetailsService自定义数据存储
- 使用LDAP身份验证的LDAP存储
推荐阅读
- 严国华|《罚罪》唐绍文身份曝光,他确实是卧底,但并非听命于严国华
- 肖振邦|《罚罪》仅剩6集!肖振邦的结局注定悲惨,邱涛的真实身份即将暴露
- 浙江卫视|前浙江卫视主持人突然晒娃,曾和杨迪传绯闻,圈外丈夫仍身份成谜
- 李伯东|罚罪:李伯东真实身份曝光,与张秋峰联手上演碟中谍
- 章安仁|《流金岁月》,章安仁或许对蒋南孙有一丝喜欢,更爱的是她的身份
- 赵鹏超|《罚罪》最狠毒之人,为钱抛弃所有亲人,“大王”身份实至名归
- |探秘新钓点鱼影都没见到,却意外钩起一螃蟹,得知身份后高兴坏了
- 陆安然|覆流年:5000两买下的冬青身份不简单,陆安然既送了人情又得忠仆
- |40岁韩国男星染毒被逮!身份被网友找到了!
- 吴镇宇|吴镇宇:坐公交被指责不该坐老人座,无奈掏出身份证,引无限感慨