Spring Security
认证流程
spring security定义了一个过滤器链,当认证请求到达这个链时,该请求将会穿过这个链用于认证和授权,这个链上可以定义N个过滤器,过滤器可以获取请求中的认证信息,根据认证方式将认证信息传递给对应的认证处理程序进行处理。
不同的过滤器处理不同的认证信息
我们以表单为例,当用户输入用户名和密码提交表单时,浏览器提交post请求到服务器,穿过过滤器链就会被UsernamePasswordAuthenticationFilter识别,UsernamePasswordAuthenticationFilter提取请求中的用户名和密码来创建UsernamePasswordAuthenticationToken对象。
通过UsernamePasswordAuthenticationFilter的attemptAuthentication()方法创建UsernamePasswordAuthenticationToken,并将其传递给AuthenticationManager的authenticate()方法。
ProviderManager实现了AuthenticationManager接口,ProviderManager有一个配置好的认证提供者列表(AuthenticationProvider),ProviderManager将收到的UsernamePasswordAuthenticationToken对象传递给列表中的每一个AuthenticationProvider进行认证。
AuthenticationProvider的实现类有很多。
其中一个是AbstractUserDetailsAuthenticationProvider实现了authenticate()方法,子类DaoAuthenticationProvider实现了AbstractUserDetailsAuthenticationProvider,实现了抽象方法retrieveUser方法,retrieveUser方法会调用实现了UserDetailService的类的loadUserByUsername方法,获取到用户信息,与用户输入的信息进行比较。