关于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配置如下<实战会讲>
[crayon-584d49a298adf482938680/]
我们从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方法,
[crayon-584d49a298ae9606368754/]这个springSecurityFilterChain的变量delegate来源都是spring security包提供的类,如前文所述,这些filter实例都是spring的inner bean,是由spring隐式地初始化并置于容器中管理的。
当然,如果想指定的话,我们是可以指定加载哪些filter和顺序的,就在配置文件applicationContext-security.xml
[crayon-584d49a298af0880536879/]
这个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/