💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
## **认证流程** 认证流程分为登录流程和注销流程,下面将一一叙述。 1)登录流程 ---> SecurityContextPersistenceFilter ---> UsernamePasswordAuthenticationFilter (先获取用户名和密码,并将其封装成UsernamePasswordToken,然后调用AuthenticationManager进行验证) ---> AuthenticationManager (根据token类型选择合适的AuthenticationProvider来处理认证请求) [默认实现类:ProviderManager] AuthenticationManager是一个用来处理请求的接口,它自己不直接处理认证请求,而是委托给其所配置的AuthenticationProvider列表,然后会依次使用每一个 AuthenticationProvider 进行认证,如果有一个AuthenticationProvider 认证后的结果不为 null,则表示该AuthenticationProvider已经认证成功,之后的AuthenticationProvider 将不再继续认证。然后直接以该 AuthenticationProvider 的认证结果作为 ProviderManager 的认证结果。如果所有AuthenticationProvider 的认证结果都为null,则表示认证失败,将抛出一个ProviderNotFoundException。 ---> AuthenticationProvider (请求认证处理) [默认实现类:DaoAuthencationProvider] DaoAuthenticationProvider认证过程: DaoAuthenticationProvider先调用UserDetailsService 的loadUserByUsername()方法获取UserDetails,获取后再与 UsernamePasswordAuthenticationFilter获取的username和password进行比较;如果认证通过后会将该 UserDetails 赋给认 证通过的 Authentication的principal,然后再把该 Authentication 存入到 SecurityContext 中。默认情况下,在认证成功后 ProviderManager也将清除返回的Authentication中的凭证信息。 注意在这里面根据需要增加[自定义关键类(UserDetailService):实现UserDetailService接口并复写loadUserByUsername()] 问:为什么AuthenticationManager不直接认证请求? 答:因为token有多种类型。比如最简单的UsernamePasswordAuthenticationToken,还有spring social的token; ---> Authentication对象 Spring Security使用一个Authentication 对象来描述当前用户的相关信息。SecurityContextHolder中持有的是当前用户的 SecurityContext,而 SecurityContext 持有的是代表当前用户相关信息的 Authentication 的引用。这个 Authentication 对象不需要我们自己去创建,在与系统交互的过程中,Spring Security会自动为我们创建相应的Authentication对象,然后赋值给当前的SecurityContext。 2)注销流程 1、使HttpSession失效; 2、清除所有已经配置的remember-me认证; 3、清除SecurityContextHolder中的user信息,并设置Authentication中的Authenticated属性为false; 4、跳转到指定url;