Spring Security学习曲线比较陡峭,因为权限本身就非常复杂,涉及到很多概念。Spring Security要比Shiro难,因为Spring Security提供的功能更多,而Shiro很多功能需要自己实现。要灵活使用Spring Security提供的功能,以及在Spring Security复杂的体系里进行扩展,则需要对Spring Security进行深入了解,否则会一筹莫展、处处受限。
选择 Spring Security 的理由
- Spring Security 的用户量要远高于 Shiro。
- Spring Security 功能比 Shiro 完善很多。Spring Security 在权限领域的各个方面都有较好的解决方案,比如JWT、OAuth2、单点登录、密码加密等。
- Spring Security 与 Spring Boot 的整合更好。
- Shiro 单点登录需要借助其它类库
buji-pac4j
,增加了学习成本,抵消了 Shiro 简单易学的优点。
基本架构
深入了解Spring Security之前,先了解Spring Security大致的运作原理。
首先,Spring Security使用一个过滤器DelegatingFilterProxy
,插入到系统中的过滤器链FilterChain
中,以发挥权限控制的功能。
DelegatingFilterProxy
只是一个代理过滤器,里面会包含一系列真正需要执行的Security Filter
。
甚至不同地址可以执行不同的过滤器链。
Security Filter
Spring Security自带了大量的过滤器,这些过滤器有固定的执行顺序(由HttpSecurity
里的FilterOrderRegistration
维护)。下面按执行先后排序:
- ForceEagerSessionCreationFilter
- ChannelProcessingFilter
- WebAsyncManagerIntegrationFilter
- SecurityContextPersistenceFilter
- HeaderWriterFilter
- CorsFilter
- CsrfFilter
- LogoutFilter
- OAuth2AuthorizationRequestRedirectFilter
- Saml2WebSsoAuthenticationRequestFilter
- X509AuthenticationFilter
- AbstractPreAuthenticatedProcessingFilter
- CasAuthenticationFilter
- OAuth2LoginAuthenticationFilter
- Saml2WebSsoAuthenticationFilter
- UsernamePasswordAuthenticationFilter
- OpenIDAuthenticationFilter
- DefaultLoginPageGeneratingFilter
- DefaultLogoutPageGeneratingFilter
- ConcurrentSessionFilter
- DigestAuthenticationFilter
- BearerTokenAuthenticationFilter
- BasicAuthenticationFilter
- RequestCacheAwareFilter
- SecurityContextHolderAwareRequestFilter
- JaasApiIntegrationFilter
- RememberMeAuthenticationFilter
- AnonymousAuthenticationFilter
- OAuth2AuthorizationCodeGrantFilter
- SessionManagementFilter
- ExceptionTranslationFilter
- FilterSecurityInterceptor
- AuthorizationFilter(官方文档暂未标记该项,但在FilterOrderRegistration源代码里存在)
- SwitchUserFilter
通过这些过滤器,就可以实现各种权限控制的功能。过滤器虽然多,但不用一个个去记,要用到哪个了解哪个。