常见的安全管理框架包括Shiro、Spring Security,Shiro轻量级,但Spring Security易于Spring Cloud整合。Spring Security除了认证和授权两个核心功能外,对常见的网络攻击也提供了防御策略。
Spring Security中,认证、授权等功能都是基于过滤器来完成的。这些过滤器按照既定的优先级排序,最终形成一个过滤器链。默认过滤器链并不是直接放在Web项目的原生过滤器链中,而是通过一个FilterChainProxy来统一管理。
简化流程图
认证
基本组件:AuthenticationManager、ProviderManager、AuthenticationProvider、AbstractAuthenticationProcessingFilter
可以同时存在多个ProviderManager,即多种认证方式。实际执行认证方法的类是AuthenticationProvider,UserDetailsService的loadUserByUserName方法加载用户信息,用户信息会被存储到SecurityContextHolder中,在进行权限控制时可以在上下文中获取用户拥有的权限。
授权
参考AbstractSecurityInterceptor的源码,SecurityMetadataSource加载所有的权限到内存,AccessDecisionManager决策用户是否有访问权限。
过滤器链分析
SecurityBuilder build方法构建过滤器链
SecurityBuilder 的实现类HttpSecurity的主要作用是用来构建一条过滤器链,也就是构建一个DefaultSecurityFilterChain对象。一个DefaultSecurityFilterChain对象包含一个路径匹配器和多个Spring Security过滤器,HttpSecurity中通过收集各种各样的xxxConfigurer, 将Spring Security过滤器对应的配置类收集起来,并保存到父类AbstractConfiguredSecurityBuilder 的configures变量中,在后续的构建过程中,再将这些xxxConfigurer构建为具体的Spring Security过滤器,同时添加到HttpSecurity的filters对象中。FilterChainProxy统一管理执行这些过滤器。
相比于HttpSecurity,WebSecurity是在一个更大的层面上去构建过滤器。一个HttpSecurity对象可以构建一个过滤器链, 也就是一个 DefaultSecurityFilterChain对象,而一个项目中可以存在多个HttpSecurity对象,也就可以构建多个DefaultSecurityFilterChain过滤器链。WebSecurity负责将 HttpSecurity所构建的DefaultSecurityFilterChain对象(可能有多个),以及其他一些需要忽略的请求,再次重新构建为一个 FilterChainProxy对象,同时添加上HTTP防火墙。
参考 《深入浅出Spring Security》