SpringSecurity的执行流程超详细讲解

SpringSec的执行流程

  • 首先就是SpringSecurity的认证流程:
    • 在SpringSecurity中有很多过滤器,其中有一个过滤器UserNamePassWordAuthenticationFilter
      SpringSecurity的执行流程超详细讲解_第1张图片

    • 认证流程都是在这个过滤器进行处理的(这个过滤器是对/login的post请求做拦截,校验表单中用户名,密码)

    • 然后在查看它的父类

      SpringSecurity的执行流程超详细讲解_第2张图片

      • 然后找到他的doFilter方法
        SpringSecurity的执行流程超详细讲解_第3张图片

      • 这里面就进行了一个判断,判断是否是Post提交,是不是解答了上面的疑问?为什么只对post请求做拦截,原因就在这。

      • 如果不是Post请求,则进行放行。

      • 接着来看源码
        SpringSecurity的执行流程超详细讲解_第4张图片

      • 第一步断点:这个不就是用来封装用户信息的那个类,(详情见文章末尾)

      • 第二步断点:下面调用这个方法的意思是:调用子类UserNamePasswordAuthentacationFilter中的attemptAuthentication方法,得到表单数据,进行身份认证,如果认证成功,返回一个authReuslt,把这个对象封装到Authentication中去。
        SpringSecurity的执行流程超详细讲解_第5张图片

      • 接着往下看源码:
        SpringSecurity的执行流程超详细讲解_第6张图片

      • 这行是不是看到熟悉的单词(Session),这行代码的含义是:配置Session的策略处理。比如:我有很多用户,我要配置session的最大并发数,如果没有配置,则不执行。

      • 接着来看:
        SpringSecurity的执行流程超详细讲解_第7张图片

      • 注意看这里是一个try,catch,有成功就肯定有失败,这步就是如果认证失败,则抛出异常,执行认证失败的方法。也就是unsuccessfulAuthentication(request,response,var8)。所以说这个失败处理并不是直接处理,而是通过抛出异常,由异常处理器处理(ExceptionTranslationFIlter:用来处理在认证授权过程中抛出的异常)

      • 接着来看
        SpringSecurity的执行流程超详细讲解_第8张图片

      • 如果认证成功,就来到了这里, 这个continueChainBeforeSuccessxxxx默认为false,如果认证成功,则变为true,执行后续操作。

  • 总结:

首先发送一个请求,会被UserNamePasswordAuthenticationFIlter拦截到, 在这里先判断是不是Post提交,判断之后调用父类方法。如果不是的话做放行,如果是的话做认证,并调用子类的attemptAuthentication方法去查数据库返回UserDetails,把认证成功的数据封装到这个Authentication对象中去,并且做一个session策略的设置,当认证失败,做异常抛出,掉认证失败方法。认证成功,把this.continueChainxxx变为true,调认证成功的方法。

  • 这个是总体的认证流程图
    SpringSecurity的执行流程超详细讲解_第9张图片

    • 当进行登录的请求时,首先会进入UesrNamePassWordAuthentacationFilter过滤器里面, 第一次登录的话就是未认证,然后通过AuthenticationManager这个类委托AuthenticationProvider去关联UserDetailService去查询数据库,判断用户是否是数据库中的用户,这就是认证的过程。
    • 当认证成功之后,把查询到的数据封装到UserDetails中去,然后被Authentication进行封装(认证之后的信息)

你可能感兴趣的:(SpringSecurity,java,spring,springboot,安全,后端)