前言
spring security的源码解析会放到具体的教程中,这部分主要是大概的介绍一下spring security的整体架构。
spring security的功能是基于Filter和interceptor实现的。我们现在来看看在引入spring security前后我们项目的架构情况:
引入spring security之前

上图显示了我们的web服务在没有认证授权模块时的示意图,用户的请求直接落到受保护的资源。
引入spring security之后

由上图可看出,spring security就像一架防火墙,只有合法的请求才会落到我们的服务。
spring security 内部详解
在上面我们大致介绍了spring security的作用,但对于我们来说spring security还是一个黑盒,其内部具体是如何运行的还不知道。那现在我们就来初步剖析一下spring security,看看里面长什么样。
spring security 内部分为上图中3个部分
- 过滤器链:过滤器链的主要作用就是认证请求,其中包含很多过滤器,不同的认证方式对应有不同的过滤器。例如,负责用户名密码认证的过滤器会判断自己是否能处理当前请求,如果能够处理的话就从请求中获取用户名和密码进行认证,否则就会忽略,将请求交给过滤器链上的下一个过滤器处理。
- 异常处理:处理过滤器链和拦截器抛出的异常,并做相应的处理。例如重定向请求或者是返回错误响应。
- 拦截器:检查请求是否合法,将不合法的请求拦截。这里判断当前请求是否合法分为两种情况:第一种情况就是当前请求访问的资源如果不需要保护,则直接放行;第二种情况就是当前请求访问的资源需要保护,那就要检查请求是否经过认证且权限是否满足。
对于上述3个部分我们后续教程都会详细讲解,针对各个部分也都会有需求实现。扩展过滤器链可以基于spring security实现个性化的认证方式,例如微信小程序登录、手机号验证码登录等等。扩展异常处理器我们可以控制错误响应,实现我们自己的错误返回标准。配置拦截器可以实现复杂的权限控制。
最后
最后,笔者想分享的一点就是,理解掌握了spring security的原理之后,spring security oauth、spring security social等等子项目对你来说就是水到渠成的事情。建议在有时间的情况下还是从基础抓起,不要只局限在一些具体标准的实现上面。在学习spring security的过程中,特别是看源码、断点跟踪的时候,遇到一些很优雅的代码会让人激动不已,这可能也是学习框架,看源码的乐趣吧。
