SpringSec的执行流程
- 首先就是SpringSecurity的认证流程: - 在SpringSecurity中有很多过滤器,其中有一个过滤器UserNamePassWordAuthenticationFilter- 认证流程都是在这个过滤器进行处理的(这个过滤器是对/login的post请求做拦截,校验表单中用户名,密码)- 然后在查看它的父类- 然后找到他的doFilter方法- 这里面就进行了一个判断,判断是否是Post提交,是不是解答了上面的疑问?为什么只对post请求做拦截,原因就在这。- 如果不是Post请求,则进行放行。- 接着来看源码- 第一步断点:这个不就是用来封装用户信息的那个类,(详情见文章末尾)- 第二步断点:下面调用这个方法的意思是:调用子类UserNamePasswordAuthentacationFilter中的attemptAuthentication方法,得到表单数据,进行身份认证,如果认证成功,返回一个authReuslt,把这个对象封装到Authentication中去。- 接着往下看源码:- 这行是不是看到熟悉的单词(Session),这行代码的含义是:配置Session的策略处理。比如:我有很多用户,我要配置session的最大并发数,如果没有配置,则不执行。- 接着来看:- 注意看这里是一个try,catch,有成功就肯定有失败,这步就是如果认证失败,则抛出异常,执行认证失败的方法。也就是unsuccessfulAuthentication(request,response,var8)。所以说这个失败处理并不是直接处理,而是通过抛出异常,由异常处理器处理(ExceptionTranslationFIlter:用来处理在认证授权过程中抛出的异常)- 接着来看- 如果认证成功,就来到了这里, 这个continueChainBeforeSuccessxxxx默认为false,如果认证成功,则变为true,执行后续操作。
- 总结:
首先发送一个请求,会被UserNamePasswordAuthenticationFIlter拦截到, 在这里先判断是不是Post提交,判断之后调用父类方法。如果不是的话做放行,如果是的话做认证,并调用子类的attemptAuthentication方法去查数据库返回UserDetails,把认证成功的数据封装到这个Authentication对象中去,并且做一个session策略的设置,当认证失败,做异常抛出,掉认证失败方法。认证成功,把this.continueChainxxx变为true,调认证成功的方法。
- 这个是总体的认证流程图- 当进行登录的请求时,首先会进入UesrNamePassWordAuthentacationFilter过滤器里面, 第一次登录的话就是未认证,然后通过AuthenticationManager这个类委托AuthenticationProvider去关联UserDetailService去查询数据库,判断用户是否是数据库中的用户,这就是认证的过程。- 当认证成功之后,把查询到的数据封装到UserDetails中去,然后被Authentication进行封装(认证之后的信息)
版权归原作者 小白在哪呢 所有, 如有侵权,请联系我们删除。