SpringSecurity基于Filter技术,经过一系列内置的或自定义的安全Filter,实现接口的认证与受权。咱们必定在使用的过程当中,定义过WebSecurityConfigurerAdapter的扩展,为程序自定义配置逻辑。java
好比,咱们想要自定义基于JWT拦截的过滤器,咱们能够经过addFilterBefore(jwtAuthenticationTokenFilter(), UsernamePasswordAuthenticationFilter.class);
的方式,将过滤器按照必定顺序加入过滤器链。spring
addFilterBefore在HttpSecurity类中:数组
public HttpSecurity addFilterBefore(Filter filter, Class<? extends Filter> beforeFilter) { comparator.registerBefore(filter.getClass(), beforeFilter); return addFilter(filter); }
见名知义,意思是在指定的beforeFilter以前加入filter。这里的comparator是内置的一个用于比较注册顺序的一个类,能够大体看一看:能够看到构造器初始化了map,key为过滤器的类对象,value为order。安全
order的顺序也是肯定的,举个例子,ChannelProcessingFilter的order值为100,后面每多一个,就加上100。ui
final class FilterComparator implements Comparator<Filter>, Serializable { private static final int INITIAL_ORDER = 100; private static final int ORDER_STEP = 100; private final Map<String, Integer> filterToOrder = new HashMap<>(); FilterComparator() { //初始化了一些默认的Filter并规定的order Step order = new Step(INITIAL_ORDER, ORDER_STEP);//越往下order越大 put(ChannelProcessingFilter.class, order.next()); //100 put(ConcurrentSessionFilter.class, order.next()); //200 put(WebAsyncManagerIntegrationFilter.class, order.next()); put(SecurityContextPersistenceFilter.class, order.next()); put(HeaderWriterFilter.class, order.next()); put(CorsFilter.class, order.next()); put(CsrfFilter.class, order.next()); put(LogoutFilter.class, order.next()); //...省略 }
compare方法定义了比较的规则:依照order排序,小的在前,大的在后。this
public int compare(Filter lhs, Filter rhs) { Integer left = getOrder(lhs.getClass()); Integer right = getOrder(rhs.getClass()); return left - right; }
以registerBefore
为例,其余相似的还有registerAt,registerAfter
。code
public void registerBefore(Class<? extends Filter> filter, Class<? extends Filter> beforeFilter) { Integer position = getOrder(beforeFilter);//获得要加入的filter的位置 if (position == null) {} put(filter, position - 1);//将当的filter存入map }
向List<Filter>
中加入filter。orm
public HttpSecurity addFilter(Filter filter) { Class<? extends Filter> filterClass = filter.getClass(); if (!comparator.isRegistered(filterClass)) {} this.filters.add(filter);//向List<Filter> 中加入filter return this; }
在全部的Filter添加完成以后,Filter其实并无按照order进行排序,由于暂时仍是按照读取的顺序进行加入的List,只有当执行了HttpSecurity.performBuild
以后,才造成按照order排序的Filter数组。jwt
在进行sort以后,根据order进行排序,生成的列表List就是最终的Filter列表。对象