首先,看一下调试的配置
FilterChainProxy的处理过程
这是一个典型的责任链模式,推荐看一下这个博客
SecurityContextPersistenceFilter
功能:负责从SecurityContextRepository获取或存储SecurityContext。SecurityContext代表了用户安全和认证过的session。
HttpRequestResponseHolder其实就是当前请求中的request、response的一个包装,
而repo就是一个HttpSessionSecurityContextRepostory就是包含当前用户线程中的SecurityContext(Session)的一个类,并从中取出SecurityContext
再进去看一下HttpSessionSecurityContextRepository的loadContext做了什么事呢
由于之前还没有登录,所以访问,所以进去之后获取的SecurityContext中的authentication为null
LogOutFilter 功能:监控一个实际为退出功能的URL(默认为/j_spring_security_logout),并且在匹配的时候完成用户的退出功能。
UserNamePasswrodAuthenticationFilter 功能:监控一个使用用户名和密码基于form认证的URL(默认为/j_spring_security_check),并在URL匹配的情况下尝试认证该用户。
这是他的继承关系
DefaultLoginPageGeneratingFilter 功能:监控一个要进行基于forn或OpenID认证的URL(默认为/spring_security_login),并生成展现登录form的HTML
BasicAuthenticationFilter 功能:监控HTTP 基础认证的头信息并进行处理
由于没有配置Basic去验证,看一下这篇博客http://sishuok.com/forum/blogPost/list/4305.html,写的还不错
RequestCacheAwareFilter 功能:用于用户登录成功后,重新恢复因为登录被打断的请求。
那requestCache.getMatchingRequest()里面又发生什么事呢
SecurityContextHolderAwareRequestFilter 功能:主要对当前request进行一个封装成一个SecurityContextHolderAwareRequestWrapper
AnonymousAuthenticationFilter 功能:如果用户到这一步还没有经过认证,将会为这个请求关联一个认证的token,标识此用户是匿名的。
这里,还有一个问题,那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进行匹配登录