对spring security的理解
要想搞清楚springsecurity 最好的切入点 是搞清楚 security的认证流程。这才是这个知识的主干。
主要原理
spring security 是基于servlet的filter。
核心类
框架的魅力就在于,它即是方便也是限制。
所以为了能用上它的方便,我们就得接受它的限制。
要想搞清楚认知流程 又得先说说几个核心类。
首先我们得实现一个继承了UserDetail的类,表示用户的一些基本信息,用户名,密码,角色等信息。然后实现一个UserDetailService的接口,主要就是里面的finduserbyname方法,就是能通过用户名找到用户。再就是我们通常要实现WebSecurityConfigurerAdapter 来做一些配置,如加入过滤器,设置一些不需要进行验证的请求 如登录,取消csrf(如果用的是token,就不存在coocie)。还有几个核心类在下面的认证流程中一起介绍
认证历程
那么我们接着说 spring security 凭什么说我们通过了验证。
那就是 SecurityContent里面有通过验证的Authentication对象
为了做到这点 又引出了另外两个核心类 SecurityContentHolder和AuthenticationManager,前者是一个工具类,我们可以通过它拿到SecurityContent,后者是一个管理器,它的作用是传入一个未认证的Authentication对它进行校验 校验通过就返回一个通过了校验的Authentication,没有就会抛出异常。假如校验通过,我们把它放到SecurityContent中,这样整个认真过程就完成了。
认证与过滤器
上面的动作在哪里完成呢?就在我们的过滤器中,或者是登录过程。
最后的重头戏就是配置过滤器,假如我们是基于token,那么我们可以在一个filter里面校验 token 校验通过后,申明一个Authentication放到SecurityContent中,最后记得继续执行过滤链。
或者是在请求登录的时候完成我们上面的认证历程。
完善
为了完善整个过程 通常我们还会自定义认证失败的回调事件等。
题外话
既然提到了servlet 那么servlet与interceptor的区别是什么?
这里只讨论时机。在servlet容器中,
httprequest–filter chain --> servlet–>interceptor --> controller - interceptor -->filter chain–>httpresponse
假如是spring mvc框架 那么它只有一个dispatchservlet 。