spring security流程框架以及authentication的流程

1.1spring security整体架构

  • 简介:就是spring security的整个流程架构,基本可以分为三个部分来介绍,

  • 一个是spring security 是如何在servlet filter和application context之间建构一个桥梁,使得application cotext的定义的filter bean 构成一个SecurityFilterChain,能够注入到serlvet filter中,从而可以实现过滤;

  • 第二部分:详细介绍,一个请求进入到SecuriyFilterChain后,里面的filter是如何协同过滤的,从而来实现用户的身份是否authentication 和athorization

  • 第三部分:Authentication的流程,以及如何去自定义验证的逻辑

1.2 第一部分的整体架构

  • 图例

在这里插入图片描述

  • 文字描述过程

    1. DelegatingFilterProxy作为spring serurity的作用的入口,其作为filter bean注入到servlet container的filterchain中,DelegatingFilterProxy通过获取ioc容器中beanName为springSecurityFilterChainFilterChainProxybean,把工作委托给FilterChainProxy来完成
    2. FilerChainProxy通过迭代挑选出最先匹配的SecurityFilterChain,然后交给这个链去执行security的检测
  • 代码分析(以springboot为例,导入spring-security-starter)

    1. DelegatingFilterProxy被注册到容器中的,以及其是如何作为作为桥梁的

      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Nz9vXvU1-1601970757596)(E:\typora\image\image-20200525151629427.png)]

      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gEMAB1jg-1601970757599)(E:\typora\image\image-20200525151750688.png)]

      解析:

      在springboot的自动配置中时注入DelegaitingFilterProxyRegistrationBean类型的bean

      目前暂时认为:就是servlet container容器在启动的时候,就会自动搜收DelegatingFilterProxyRegistrationBeanbean,然后调用该bean的getFilter()的方法,把返回的new DelegatingFilterProxy实例注入到filterChain,中,从而实现spring security的接口

    2. DelegatingFilterProxy是如何把工作交给FilterChainProxy处理的

      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7NFdTNtx-1601970757608)(E:\typora\image\5.7-1590390550158.png)]

      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3rhnbada-1601970757610)(E:\typora\image\5.5.png)]

      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7GH0iH2o-1601970757612)(E:\typora\image\5.6.png)]

      解析:

      DelegatingFilterProxyinitDelegate()方法,通过beanName(springSecurityFilterChain)来获取容器中的FilterChainProxybean

      DelegatingFilterProxy有doFilter()方法,在该方法中可以通过该方法把该工作代理给FilterChainProxy

    3. FilterChainProxy是在哪里把其注册到容器中的呢

      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zbDIbc6T-1601970757613)(E:\typora\image\5.10.png)]

    4. FilterChainProxy中的doFilter具体是如何工作的

      FilterChainProxy本质一个bean filter,在其doFilter的方法中,迭代多条SecurityFilterChain,把第一个match(request)正确的securityFilterChain中的filtes获取出来,以virtalFilerChain的方式把执行这些filters,执行完这些filters后,则接着回到执行整个serlvet contianer 中的FilterChain中-语句chain.doFilter(fwRequest, fwResponse);

1.3 第二部分-----SecurityFilterChain整体流程架构

  1. 简介:这节主要将的是,请求进入到一条SecurityFilterChain中,执行的流程是什么

  2. 执行的流程

    1. spring security 中提供的filter的执行顺序的依据是什么

      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xo6cQ0j7-1601970757613)(E:\typora\image\image-20200609111406635.png)]

    2. 通过debuganyPathRequest查看请求在多个filter中执行的痕迹

        logging:
          level:
            org.springframework.security.web.authenticatio: debug
            org.springframework.security.web.util.matcher: debug
            org.springframework.security.authentication.dao: debug
      

      通过这些,就可以查看

  3. 案例(分析其执行的流程)

    • 案例描述:有三条自定义的securityFilterChain,对其中一条链进行分析

      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qaoxv9Ar-1601970757615)(E:\typora\image\image-20200609112319825.png)]

      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LB6NzvKQ-1601970757617)(E:\typora\image\image-20200609112343700.png)]

    • 流程

      1. 启动项目

        [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OIoiBLfR-1601970757618)(E:\typora\image\image-20200609112507927.png)]

      2. 访问http://localhost:8080/html/login1.html,login1.html位于的目录是static/html

        [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jNUvRCo1-1601970757619)(E:\typora\image\image-20200609112821992.png)]

      3. 在login1.html中登录,访问"/admin/login"

        [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fXagN1cY-1601970757620)(E:\typora\image\image-20200609113207206.png)]

        [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-I6sybJ2p-1601970757622)(E:\typora\image\image-20200609113306091.png)]

        代码解析,可以看到login请求,在进入到多条过滤链中,首先看是否匹配在websecurity中配置的不拦截静态资源的地址(即请求不会进入到过滤链中执行,一般只要一条链配置就可以啦,就可以达到不拦截的效果),然后进入到1过滤链,请求不匹配,不进入,2也是这样,由于3是任何请求都匹配的,所以进入到3链中

        进入3链后,该login请求经过logout filter,判断与logout filter中拦截的地址有没有匹配,从图看出,不匹配,然后执行FormLogin中,匹配,验证成功,然后重定向到loginSeccess地址,相当于浏览器重新发一次请求,然后请求/login的流程的过程也是一样的,然后在FilterSecurityInterceptor中,匹配anyrequest,由于其已经登录成功,所以带有成功SessionId,此时,在SecurityContext有Authentiacation,依此来判断,成功,则放行,接下来往下执行,最后就会到selvet中,映射到相应的controller中

      4. 如果登录不成功怎么样

        [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pQRkMtO4-1601970757622)(E:\typora\image\image-20200609114441528.png)]

        [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mJTbcC5h-1601970757623)(E:\typora\image\image-20200609114505275.png)]

        由于在FormLogin中配置对于LoginFail配置的失败后转发的地址是permitAll的,所以在FilterSecurityInterceptor就会被放行(注意:在这里的permitAll与在authorizeRequests()配置的permitAll起到的作用不一致,后面有讲到)

      5. 如果在没有登录的情况下,直接访问/admin/hello

        [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7lyQIAax-1601970757624)(E:\typora\image\image-20200609114911064.png)]

        [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6bIFysIj-1601970757625)(E:\typora\image\image-20200609115033522.png)]

        [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dIUXXwAt-1601970757626)(E:\typora\image\image-20200609115313958.png)]

      6. 总结

        就是如果该请求在不登录的情况下,直接访问,在FilterSecurityIncerptor进行拦截的时候,如果在FilterSecurityIncerptor有配置该地址的permitAll,则匹配,直接放行,如果没有配置,则会匹配到anyRequst(),中(前提:anyRequest().authentication()),判断是否登录(SecurityContext已经有Authentcation),如果有,则放行,如果没有则抛出异常,被ExceptionTranslationFilter接收到该异常,通过authenticationentryPotin中配置的地址,重定向该地址,从而可以处理该异常,但如果在登录(SecurityContext已经有Authentcation)的情况下,则在FilterSecurityInceptor就会被放行

        注意anyRequst(),中(前提:anyRequest().anyAuthority(“ADMIN”)),则在会匹配到anyRequst(),后,不但会判断其是否登录,也同时判断其Authentication中的authority中是否是ADMIN,如果没有登录,则抛出异常,被ExceptionTranslationFilter接收到该异常,但如果登录了,authority不符合,则直接产生/error(其不是重定向的)

        [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZLLcxoh6-1601970757627)(E:\typora\image\image-20200609120909553.png)]

1.4 authenticaiton的流程

  1. 基本的过程

    就是在进行验证之前,先构造一个AuthenticationToken(例如:前端页面传来的username和password),然后把AuthencationToken交给ProviderManager(是AuthenticationManager的实现类)用来Authenticate,不过其委托给ProviderManager来处理的,验证成功后,会返回一个Authentication,之后把该Authentication加到SecurityCo

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值