在之前的所有程序中,只要知道了访问地址就可以对其进行访问。接下来使用SpringSecurity来为程序添加保护。主要学习到的有:身份认证(你是谁)、授权(你能做什么)和攻击保护(防止伪造身份)。
先看看SpringSecurity的基本原理:通过Filter过滤器链来实现安全验证,执行逻辑如下图:
首先会判断请求体中是否包含用户名、密码信息,如果有那就会被第一个绿色Filter处理。否则,就会再判断是否包含Basic,将其交给第二个绿色Filter处理。绿色的FIlter是可以被我们自定义的,其他颜色的过滤器是不能被更改、自定义的。
之后请求会进入到黄色的FilterSecurityInterceptor中,这是最后一道关卡。它将会验证该请求是否已经通过了UsernamePassword或Basic验证,如果没有通过,就会抛出相应的异常信息,异常信息会被蓝色的ExceptionTranslationFilter所处理,将请求打回到验证界面。验证通过后就可以调用Rest服务。
接下来通过查看源码,打断点运行,访问程序来实际看下SpringSecurity的运行流程。
FilterSecurityInterceptor类:
用来验证的主要是第124行代码,我们为其打上断点。
ExceptionTranslationFilter类:
这个类的主要代码都在catch块里面
我们在第123行打上断点,看其捕获的异常是啥。
UsernamePasswordAuthenticationFilter类:
可以看到这个类只处理以post方式提交的/login请求。
主要来进行验证的部分代码如下
接下来运行程序,输入地址栏之后由于请求体中不存在username、password或basic,所以会直接进入到黄色FilterSecurityInterceptor之中
由于未通过验证,所以我们的请求体不能通过最后一道关卡,黄色部分会抛出异常。F6接着执行后便会进入到蓝色的ExceptionTranslationFilter中
当它捕获到异常之后便会根据异常信息做相应处理,由于我在这里开启的是form验证,所以在浏览器端会显示如下页面:
输入user/默认密码(见控制台)后,会进入到UsernamePasswordAuthenticationFilter之中,
接着运行,会再次进入到黄色FilterSecurityInterceptor中,因为已经通过了UsernamePasswordAuthenticationFilter的验证,所以可以通过最后一道关卡,进入到Result API中,
至此,关于SpringSecurity的运行流程全部结束。