[Spring Security 4][原理]源码与启动原理/工作模式

关于spring security的加载方式,其很多还是依赖spring容器,所以我们这里只关注 Spring Security的获取加载模式。

本文http://www.paymoon.com:8001/index.php/2016/12/07/how-do-ss4-start-and-work/

如果转载请联系i@paymoon.com

Spring-Security的切入点为DelegatingFilterProxy

web.xml配置如下<实战会讲>

我们从DelegatingFilterProxy开始到具体工作过程

这个filter本身并不处理具体的请求,它其实是一个filter chain,它内部包含了一个由多个spring security提供的filter的list,它负责把请求委派给list中的每一个filter进行处理。

他是spring的web包下的class, 继承了

GenericFilterBean,

而GenericFilterBean implements Filter

所以 DelegatingFilterProxy本质上是一个filter,并且会执行dofilter, 由于本身他就是代理,他会依赖演注入的filter, 是哪个呢?

他的变量:

private volatile Filter delegate;

请看他的dofilter方法,

这个springSecurityFilterChain的变量delegate来源都是spring security包提供的类,如前文所述,这些filter实例都是spring的inner bean,是由spring隐式地初始化并置于容器中管理的。
当然,如果想指定的话,我们是可以指定加载哪些filter和顺序的,就在配置文件applicationContext-security.xml
这个filter就会走到我们之前说到ss4实现权限流程中的UsernamePasswordAuthenticationFilter和FilterSecurityInterceptor
示例的代码中,因为我写了自定义的myAuthenticationFilter<继承了UsernamePasswordAuthenticationFilter>
和myFilter<继承了FilterSecurityInterceptor>
两者区别:
UsernamePasswordAuthenticationFilter:该filter用于用户初次登录时验证用户身份(authentication)。该filter只在初次认证时存在,一旦认证通过将会从 filter chain中移除。
 
FilterSecurityInterceptor:当用户登入成功之后,每次发送请求都会使用该filter检查用户是否已经通过了认证。如果通过了认证,就放行,否则转向登录页面。
两个filter的差别在于: 第一个负责初次登入时的用户检查,这个检查需要根据用户提供的用户名和密码去数据库核对,若存在,将相关信息封装在一个Authentication对象中。这个filter可以说是处理初次登录时的authentication工作。而第二个filter则不需要像每个filter每次都去查询数据库,它只需要从 security context中查看当前请求用户对应的Authentication 对象是否已经存在就可以了,这个filter处理的是登入成功之后的authentication工作。这个filter是需要拦截每次请求的。

本文http://www.paymoon.com:8001/index.php/2016/12/07/how-do-ss4-start-and-work/ 如果转载请联系i@paymoon.com

相关文章:
http://www.paymoon.com:8001/index.php/2016/12/07/how-ss4-apply-the-permission/

发表评论

电子邮件地址不会被公开。