1-SpringSecurity核心功能
1.认证
什么是认证:
SpringSecurity作为一款成熟的鉴权框架,目前支持的认证机制非常的全,这里我们可以简单了解一下:
●表单认证
●OAuth2.0认证
●SAML2.0认证
●CAS认证
●RememberMe 自动认证
●JAAS认证
●OpenID 去中心化认证
●X509认证
●Http Basic认证
●Http Digest认证
而SpringSecurity不仅可以支持上面的认证机制,还可以通过引入第三方依赖支持更多认证方式,同时也允许用户自定义认证逻辑(这个我们后面会讲)。
2.鉴权
基于上面的多种认证方式(实际那种认证都不影响鉴权),SpringSecurity支持基于URL的请求授权、方法访问授权、支持SPEL表达式访问控制、支持ACL自定义对象安全,同时支持动态授权配置、支持RBAC权限模型,简单一句话:基本没有SpringSecurity做不了的鉴权。
3.其他
除了熟知的认证、授权两个核心功能,SpringSecurity还可以自动防御很多网络攻击,如CSRF攻击等,可参照:
2-SpringSecurity核心架构
SpringSecurity的种种功能,都是基于过滤器实现的,这些过滤器根据默认或用户指定的顺序(@Order注解或实现Ordered接口)排列,形成一个过滤器链。
1.过滤链
SpringSecurity的功能实现关键就是依赖过滤器链
Spring Security 的 Servlet 支持是基于 Servlet Filter 的,因此首先大致了解一下 Filter 的作用是有帮助的。下图显示了单个 HTTP 请求的处理程序的典型分层:
LFIFTERCHAIIN
SERVLET
CLIENT
FILTER.
FILTER.
FILTER
企妇妇中中中企北归在公业店中业中妇妇企
工
工
客户端(广义的前端)向应用程序(广义的后端)发送请求,容器根据请求URI路径创建FilterChain,其中包含应处理 HttpServletRequest的 Filter实例和 Servlet(可以简单理解就是一个运行的tomcat容器、WebLogic容器)。在 SpringMVC 应用程序中,Servlet 是 DispatcherServlet 的实例。一个 Servlet 最多可以处理一个 HttpServletRequest 和 HttpServletResponse。大致实现代码如下:
2.委托过滤代理
如果用户需要注册自己的过滤器标准,就可以采用委托过滤处理
Spring 提供了一个Filter名为 的实现DelegatingFilterProxy,允许在 Servlet 容器的生命周期和 Spring 的ApplicationContext。Servlet容器允许Filter使用自己的标准注册实例。您可以借助DelegatingFilterProxy通过标准 Servlet 容器机制进行注册,但将所有工作委托给实现Filter。
DELEGATINGFILTERPROXY
ITERCHAN
BEANFILTER
SERVLET
FILTER.
CLIENT
业维店际店庐际中店店桑店在桑际店在桑维铁
1
FILTER
量
DelegatingFilterProxy从查找Bean Filter ApplicationContext然后调用Bean Filter,大致实现代码:
3.过滤器链代理
SpringSecurity的过滤器链是通过FilterChainProxy嵌入到Web项目的原生过滤器链中
Spring Security 的 Servlet 支持包含在FilterChainProxy。FilterChainProxy是 Spring Security 提供的特殊功能Filter,允许Filter通过 委托给许多实例SecurityFilterChain。由于FilterChainProxy是一个 Bean,因此它通常包装在DelegatingFilterProxy中。
SECURITYFILTERCHAIN
DELEGATINGFILTERPROXY
FILTERCHAINPROXY
LFILFTERCHAIN
SERVLET
FILTER.
石中中中财中西中业中在公际I中公杭在中A中
FILTER
CLIENT
1
工
1
简单来说:SpringSecurity的过滤器链是通过FilterChainProxy嵌入到Web项目的原生过滤器链中。而这样的过滤链也不止一个,形如下面的安全过滤链中的图示,右侧就为我们展示了多个过滤链情况。
4.安全过滤链
过滤器链也会有多个,如请求URI:/user/**和/admin/**就可以是两个过滤器链,对应下图右侧
SecurityFilterChainFilterChainProxy 使用它来确定Filter应为当前请求调用哪些 Spring Security 实例。
DELEGATINGFILTERPROXY
SECUIRIITYAFIFTERCHAIN
SECURITYFILTER.
FILTERCHAINPROXY
SECURITYFILTER.
LFITERCLHAN
SERVLET
FILTER
全重妇药购商桑维公在在啡好公在北妇公中
CLIENT
FILTER.
下图显示了多个SecurityFilterChain实例
DELEGATINGFILTERPROXY
SECURITYFLTERCHAIN
FILTERCHAINPROXY
FTERCHAIN
SECURITYIFITERCHAINO
CLIENT
SERVLET
FILTER.
FILTER
596659G6OGGGG669G659965O9G399
AO达
国
中中电电中中中中中中中中中中中中中中中国商中中百中
K
品二地
在中中在日中中
3I电1元中电中电中中中1
5.处理安全异常
允许将和ExceptionTranslationFilter转换为 HTTP 响应。AccessDeniedExceptionAuthenticationException
ExceptionTranslationFilter作为安全过滤器之一插入FilterChainProxy中。
ExceptionTranslationFilter下图展示了与其他组件的关系:
AUTHENTICATIONENTRYPOINT
ACCESSDENIEDHANDLER
EXCEPTIONTRANSLATION
SECURITYCONTEXTHOLDER
SART/AUHENUICAATTON
SECURTYTERCHAN
ACCESSDENLEO
RECUCSTNORTNNEY
REQUESTCACHE
国中GGG中GG中GG中中GG中中GG中中中G中GGGGG中G在动
EXCEPONL
SECUITTY
量中国在中话国国国公国在话公公级话公
OINRINUEPIOCESSNG
AAGGAGG中GGGT
FILTER
量
GAAAEGEE
●首先,ExceptionTranslationFilter调用FilterChain.doFilter(request, response)应用程序的其余部分。
●如果用户未经过身份验证或者是AuthenticationException,则开始身份验证。
○SecurityContextHolder被清除。
○HttpServletRequest保存后,以便在身份验证成功后可用于重放原始请求。
○用于AuthenticationEntryPoint向客户端请求凭据。例如它可能会重定向到登录页面或发送WWW-Authenticate标头。
●否则,如果它是AccessDeniedException,则Access Denied。调用AccessDeniedHandler来处理拒绝访问。