SpringSecurity中对过滤器的配置:addFilterBefore SpringSecurity中对过滤器的配置:addFilterBefore SpringSecurity基于Filter技术,通过⼀系列内置的或⾃定义的安全Filter,实现接⼝的认证与授权。我们⼀定在使⽤的过程中,定义过WebSecurityConfigurerAdapter的扩展,为程序⾃定义配置逻辑。
⽐如,我们想要⾃定义基于JWT拦截的过滤器,我们可以通过addFilterBefore(jwtAuthenticationTokenFilter(), UsernamePasswordAuthenticationFilter.class);的⽅式,将过滤器按照⼀定顺序加⼊过滤器链。
addFilterBefore在HttpSecurity类中:
public HttpSecurity addFilterBefore(Filter filter,
Class<? extends Filter> beforeFilter) {
return addFilter(filter);
}
见名知义,意思是在指定的beforeFilter之前加⼊filter。这⾥的comparator是内置的⼀个⽤于⽐较注册顺序的⼀个类,可以⼤致看⼀看:可以看到构造器初始化了map,key为过滤器的类对象,value为order。
order的顺序也是确定的,举个例⼦,ChannelProcessingFilter的order值为100,后⾯每多⼀个,就加上100。
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, ()); //100
put(ConcurrentSessionFilter.class, ()); //200
put(WebAsyncManagerIntegrationFilter.class, ());
put(SecurityContextPersistenceFilter.class, ());
put(HeaderWriterFilter.class, ());
put(CorsFilter.class, ());
put(CsrfFilter.class, ());
put(LogoutFilter.class, ());
//...省略
}
filter过滤对象数组compare⽅法定义了⽐较的规则:依照order排序,⼩的在前,⼤的在后。
public int compare(Filter lhs, Filter rhs) {
Integer left = Class());
Integer right = Class());
return left - right;
}
registerBefore
以registerBefore为例,其他类似的还有registerAt,registerAfter。
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
}
addFilter
向List<Filter> 中加⼊filter。
public HttpSecurity addFilter(Filter filter) {
Class<? extends Filter> filterClass = Class();
if (!comparator.isRegistered(filterClass)) {}
this.filters.add(filter);//向List<Filter> 中加⼊filter

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。