1、本质是过滤链
一、关于配置
1、继承WebSecurityConfigurerAdapter类
2、重写两个configure,一个是配置认证策略,一个是配置AuthenticationManagerBuilder,配置它的用户信息,它是AnthenticationManager构建者
二、基本流程
1、首先UsernamePasswordAuthenticationFilter过滤请求,默认是过滤POST的/login请求,获取username和password,用UsernamePasswordAuthenticationToken包装(它就实现了Authentication)。
2、UsernamePasswordAuthenticationToken作为参数调用AuthenticationManager的authentication()方法,它是一个认证管理器(接口),有很多认证实现类,默认实现类是ProviderManager,ProviderManager管理许多AuthenticationProvider(认证器),遍历找到适合的认证器去认证。
3、认证器会调用之前实现的UserDetailSevice接口,继承loadUserByUsername方法,这里去数据库获取用户信息,然后返回一个UserDetail对象。
4、认证器拿到UserDetail后,做一些判断没问题后,返回一个authentication对象
三、如何实现共享
1、最开始请求先经过SecurityContextPersistenceFilter过滤器,目的就是检查session是否有SecurityContext信息(里边包含authentication信息),没有就new一个,又把SecurityContext放到SecurityContextHolder 中,响应的时候是从该线程获取新的authentication,然后放到SecurityContext中。
2、FilterSecurityInterceptor负责把认证对象放到请求中。如果前边认证成功,就把认证信息放到线程中,如果需要认证就直接跳转到认证页面。