常見的安全管理框架包括Shiro、Spring Security,Shiro輕量級,但Spring Security易于Spring Cloud整合。Spring Security除了認證和授權兩個核心功能外,對常見的網(wǎng)絡攻擊也提供了防御策略。
Spring Security中,認證、授權等功能都是基于過濾器來完成的。這些過濾器按照既定的優(yōu)先級排序,最終形成一個過濾器鏈。默認過濾器鏈并不是直接放在Web項目的原生過濾器鏈中,而是通過一個FilterChainProxy來統(tǒng)一管理。
簡化流程圖

認證
基本組件:AuthenticationManager、ProviderManager、AuthenticationProvider、AbstractAuthenticationProcessingFilter
可以同時存在多個ProviderManager,即多種認證方式。實際執(zhí)行認證方法的類是AuthenticationProvider,UserDetailsService的loadUserByUserName方法加載用戶信息,用戶信息會被存儲到SecurityContextHolder中,在進行權限控制時可以在上下文中獲取用戶擁有的權限。

授權

參考AbstractSecurityInterceptor的源碼,SecurityMetadataSource加載所有的權限到內(nèi)存,AccessDecisionManager決策用戶是否有訪問權限。
過濾器鏈分析
SecurityBuilder build方法構(gòu)建過濾器鏈
SecurityBuilder 的實現(xiàn)類HttpSecurity的主要作用是用來構(gòu)建一條過濾器鏈,也就是構(gòu)建一個DefaultSecurityFilterChain對象。一個DefaultSecurityFilterChain對象包含一個路徑匹配器和多個Spring Security過濾器,HttpSecurity中通過收集各種各樣的xxxConfigurer, 將Spring Security過濾器對應的配置類收集起來,并保存到父類AbstractConfiguredSecurityBuilder 的configures變量中,在后續(xù)的構(gòu)建過程中,再將這些xxxConfigurer構(gòu)建為具體的Spring Security過濾器,同時添加到HttpSecurity的filters對象中。FilterChainProxy統(tǒng)一管理執(zhí)行這些過濾器。
相比于HttpSecurity,WebSecurity是在一個更大的層面上去構(gòu)建過濾器。一個HttpSecurity對象可以構(gòu)建一個過濾器鏈, 也就是一個 DefaultSecurityFilterChain對象,而一個項目中可以存在多個HttpSecurity對象,也就可以構(gòu)建多個DefaultSecurityFilterChain過濾器鏈。WebSecurity負責將 HttpSecurity所構(gòu)建的DefaultSecurityFilterChain對象(可能有多個),以及其他一些需要忽略的請求,再次重新構(gòu)建為一個 FilterChainProxy對象,同時添加上HTTP防火墻。
參考 《深入淺出Spring Security》