SpringSecurity Filter处理流程

2014-11-24 01:37:22 · 作者: · 浏览: 0
首先,看一下调试的配置
\
FilterChainProxy的处理过程 这是一个典型的责任链模式,推荐看一下这个博客 http://www.verydemo.com/demo_c143_i2473.html \
SecurityContextPersistenceFilter
功能:负责从SecurityContextRepository获取或存储SecurityContext。SecurityContext代表了用户安全和认证过的session。 \


HttpRequestResponseHolder其实就是当前请求中的request、response的一个包装, \
而repo就是一个HttpSessionSecurityContextRepZ http://www.2cto.com/kf/ware/vc/" target="_blank" class="keylink">vc3Rvcnm+zcrHsPy6rLWxx7DTw7unz9+zzNbQtcRTZWN1cml0eUNvbnRleHQoU2Vzc2lvbim1xNK7uPbA4KOssqK009bQyKGz9lNlY3VyaXR5Q29udGV4dAo8YnI+Cgo8YnI+Cgo8YnI+CgrU2b34yKW/tNK7z8JIdHRwU2Vzc2lvblNlY3VyaXR5Q29udGV4dFJlcG9zaXRvcnm1xGxvYWRDb250ZXh01/bBy8qyw7TKwsTYCgoKPGltZyBzcmM9"https://www.cppentry.com/upload_files/article/76/1_u1vuu__.jpg" alt="\">


\




由于之前还没有登录,所以访问,所以进去之后获取的SecurityContext中的authentication为null

LogOutFilter 功能:监控一个实际为退出功能的URL(默认为/j_spring_security_logout),并且在匹配的时候完成用户的退出功能。
\


UserNamePasswrodAuthenticationFilter 功能:监控一个使用用户名和密码基于form认证的URL(默认为/j_spring_security_check),并在URL匹配的情况下尝试认证该用户。


这是他的继承关系


\

\
上面由于requiresAuthentication()不需要验证,也就是不是以/j_spring_security_check结尾的请求行,所以,没有进行下面的验证 验证就下次吧,这可是SpringSecurity的重点

DefaultLoginPageGeneratingFilter 功能:监控一个要进行基于forn或OpenID认证的URL(默认为/spring_security_login),并生成展现登录form的HTML
\

BasicAuthenticationFilter 功能:监控HTTP 基础认证的头信息并进行处理 \


由于没有配置Basi y"http://www.2cto.com/kf/yidong/wp/" target="_blank" class="keylink">WPIpdHp1qSjrL+00rvPwtXixqqyqb/NaHR0cDovL3Npc2h1b2suY29tL2ZvcnVtL2Jsb2dQb3N0L2xpc3QvNDMwNS5odG1so6zQtLXEu7myu7TtPC9hZGRyZXNzPgo8YnI+CjwvYWRkcmVzcz4KPGJyPgo8L2FkZHJlc3M+CjxzdHJvbmc+UmVxdWVzdENhY2hlQXdhcmVGaWx0ZXI8L3N0cm9uZz48L2FkZHJlc3M+CrmmxNyjutPD09rTw7untcfCvLPJuaa686Os1tjQwrvWuLTS8s6qtcfCvLG7tPK2z7XEx+vH86GjPC9hZGRyZXNzPgo8aW1nIHNyYz0="https://www.cppentry.com/upload_files/article/76/1_kkwgk__.jpg" alt="\">


那requestCache.getMatchingRequest()里面又发生什么事呢 \ 可见,在请求需要登录权限的时候,SpringSecurity会把当前的request缓存起来,以便在登录成功之后重新响应那个request


SecurityContextHolderAwareRequestFilter 功能:主要对当前request进行一个封装成一个SecurityContextHolderAwareRequestWrapper \


AnonymousAuthenticationFilter 功能:如果用户到这一步还没有经过认证,将会为这个请求关联一个认证的token,标识此用户是匿名的。 \

\ 所以,没被验证的用户就有了一个ROLE_ANONYMOUS的权限了
这里,还有一个问题,那key是怎么得来的?


SessionManagerFilter 功能:根据认证的安全实体信息跟踪session,保证所有关联一个安全实体的session都能被跟踪到。 \
这个过滤器,推荐读一下这两篇博客 http://sishuok.com/forum/blogPost/list/4307.html http://sishuok.com/forum/blogPost/list/4308.html

ExceptionTranslationFilter 功能:解决在处理一个请求时产生的指定异常


FilterSecurityInterceptor 功能:简化授权和访问控制决定,委托一个AccessDecisionManager完成授权的判断
这个filter是filterchain中比较复杂,也是比较核心的过滤器,主要负责授权的工作,这个filter就下次吧


总结: 1、SpringSecurity在过滤链上很重要的设计模式就是过滤链模式,过滤链模式不是一直进行下去的,他是通过filter所过滤的url进行匹配,匹配上了就进行相应的处理,并原路返回 2、SpringSecurity中通过将验证过的securityContext存储在securityContextrepositoty,其中包括登录信息,还有Session等信息,如果登录成功过的,他会同时将session加进去,在下一次访问时可以用session进行匹配登录