Spring Security源码解读方法和技巧
一 文章参考
http://www.spring4all.com/article/443
http://www.spring4all.com/article/445
http://www.spring4all.com/article/446
http://www.spring4all.com/article/447
http://www.spring4all.com/article/448
二 代码位置
https://github.com/cakin24/gs-securing-web
https://github.com/cakin24/spring-security-ipLogin
三 需要掌握的关键类
- SecurityContextHolder
- Authentication
- UsernamePasswordAuthenticationToken
- AuthenticationManager
- ProviderManager
- AuthenticationProvider
- DaoAuthenticationProvider
- UserDetails
- UserDetailsService
- WebMvcConfigurerAdapter
- WebSecurityConfigurerAdapter
- WebSecurityConfiguration
- AuthenticationConfiguration
- AuthenticationManagerBuilder
- WebSecurity
- HttpSecurity
四 需要掌握关键过滤器
- SecurityContextPersistenceFilter 两个主要职责:请求来临时,创建SecurityContext安全上下文信息,请求结束时清空SecurityContextHolder。
- HeaderWriterFilter (文档中并未介绍,非核心过滤器) 用来给http响应添加一些Header,比如X-Frame-Options, X-XSS-Protection*,X-Content-Type-Options.
- CsrfFilter 在spring4这个版本中被默认开启的一个过滤器,用于防止csrf攻击,了解前后端分离的人一定不会对这个攻击方式感到陌生,前后端使用json交互需要注意的一个问题。
- LogoutFilter 顾名思义,处理注销的过滤器
- UsernamePasswordAuthenticationFilter 这个会重点分析,表单提交了username和password,被封装成token进行一系列的认证,便是主要通过这个过滤器完成的,在表单认证的方法中,这是最最关键的过滤器。
- RequestCacheAwareFilter (文档中并未介绍,非核心过滤器) 内部维护了一个RequestCache,用于缓存request请求
- SecurityContextHolderAwareRequestFilter 此过滤器对ServletRequest进行了一次包装,使得request具有更加丰富的API
- AnonymousAuthenticationFilter 匿名身份过滤器,这个过滤器个人认为很重要,需要将它与UsernamePasswordAuthenticationFilter 放在一起比较理解,spring security为了兼容未登录的访问,也走了一套认证流程,只不过是一个匿名的身份。
- SessionManagementFilter 和session相关的过滤器,内部维护了一个SessionAuthenticationStrategy,两者组合使用,常用来防止session-fixation protection attack,以及限制同一用户开启多个会话的数量
- ExceptionTranslationFilter 直译成异常翻译过滤器,还是比较形象的,这个过滤器本身不处理异常,而是将认证过程中出现的异常交给内部维护的一些类去处理,具体是那些类下面详细介绍
- FilterSecurityInterceptor 这个过滤器决定了访问特定路径应该具备的权限,访问的用户的角色,权限是什么?访问的路径需要什么样的角色和权限?这些判断和处理都是由该类进行的。
五 学习这些关键类和过滤器的技巧
1 阅读源码
https://github.com/cakin24/gs-securing-web
https://github.com/cakin24/spring-security-ipLogin
以这两个项目作为源码阅读和调试的基础项目。进入Spring Security内部源码,理解阅读,画出各个类的UML类图。
2 调试源码
2.1 当调试关键类时,在关键函数关键位置打断点,跟踪执行流程。
2.2 当调试过滤器时,在过滤器的入口和出口打上断点,采用线程方式调试,观察各个过滤器的执行顺序以及关键变量的值。
2.3 调试常用快捷键。
F7:单步调试,能进入函数内部。
F8:单步调试,不能进入函数内部。
F9:跳到下一个断点。
还没有评论,来说两句吧...