springsecurity是通过过滤器链来完成认证功能的。
左边两个绿色过滤器可以自己控制是否执行,蓝色橘色过滤器一定会执行。UsernamePasswordAuthenticationFilter的执行点是springsecurity配置类中 httpSecurity.formLogin(),如果没有这句配置是不会触发这个过滤器的,这个过滤器会要求提交方式是post,且是form提交,满足这两个条件后会将提交的用户名和密码封装成UsernamePasswordAuthenticationToken,并交给 AuthenticationManager去做具体校验,具体校验需要查询数据库,这部分需要自己编写,框架无法完成,需要在springsecurity配置类中通过auth.userDetailsService(UserDetailsService实现类)来配置自己的校验类,校验通过后会将返回的Authentication对象通过SecurityContextHolder.getContext().setAuthentication(authenticationToken);保存到当前线程内,FilterSecurityInterceptor是最后一个过滤器,会查看SecurityContextHolder里是否有authenticationToken,如果有authenticationToken代表通过校验,如果没有会判断这个url是否设置了允许匿名访问之类的处理,如果没有类似的设置就会抛异常,异常会被ExceptinTranslationFilter捕获。执行API后会执行 SecurityContextHolder.clearContext()清除认证对象。如果不想用 UsernamePasswordAuthenticationFilter,可以自己封装UsernamePasswordAuthenticationToken,自己创建AuthenticationManager调用校验逻辑。
原文:https://www.cnblogs.com/1--2/p/14655052.html