ObjectPostProcessor使用

前面介绍了 ObjectPostProcessor 的基本概念。相信读者已经明白,所有的过滤器都由对应的配置类来负责创建,配置类在将过滤器创建成功之后,会调用父类的 postProcess 方法,该方法最终会调用到 CompositeObjectPostProcessor 对象的 postProcess 方法,在该方法中,会遍历 CompositeObjectPostProcessor 对象所维护的 List 集合中存储的所有 ObjectPostProcessor 对象,并调用其 postProcess 方法对对象进行后置处理。默认情况下,CompositeObjectPostProcessor 对象中所维护的 List 集合中只有一个对象那就是 AutowireBeanFactoryObjectPostProcessor,调用 AutowireBeanFactoryObjectPostProcessor 的 postProcess 方法可以将对象注册到 Spring 容器中去。

开发者可以自定义 ObjectPostProcessor 对象,并添加到 CompositeObjectPostProcessor 所维护的 List 集合中,此时,当一个过滤器在创建成功之后,就会被两个对象后置处理器处理,第一个是默认的对象后置处理器,负责将对象注册到 Spring 容器中;第二个是我们自定义的对象后置处理器,可以完成一些个性化配置。

自定义 ObjectPostProcessor 对象比较典型的用法是动态权限配置(权限管理将在后续章节具体介绍),为了便于大家理解,笔者这里先通过一个大家熟悉的案例来展示 ObjectPostProcessor 的用法,后面在配置动态权限时,ObjectPostProcessor 的使用思路是一样的。

@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests()
                .anyRequest().authenticated()
                .and()
                .formLogin()
                .withObjectPostProcessor(new ObjectPostProcessor<UsernamePasswordAuthenticationFilter>() {
                    @Override
                    public <O extends UsernamePasswordAuthenticationFilter> O postProcess(O object) {
                        object.setUsernameParameter("name");
                        object.setPasswordParameter("passwd");
                        object.setAuthenticationSuccessHandler((req,resp,auth)->{
                            resp.getWriter().write("login success");
                        });
                        return object;
                    }
                })
                .and()
                .csrf().disable();
    }
}
java

在这个案例中,调用 formLogin 方法之后,开启了 FormLoginConfigurer 的配置,FormLoginConfigurer 的作用是为了配置 UsernamePasswordAuthenticationFilter 过滤器,在 formLogin 方法执行完毕后,我们调用 withObjectPostProcessor方法对 UsernamePasswordAuthenticationFilter 过滤器进行二次处理,修改登录参数的 key,将登录用户名参数的 key 改为 name,将登录密码参数的 key 改为 passwd 同时配置一个登录成功的处理器。

方便起见,这里就不创建登录页面了,我们直接使用 POSTMAN 工具来进行登录接口测试,测试结果如图4-7所示。

image 2024 04 12 15 40 51 293
Figure 1. 图4-7 登录接口测试

我们在第 2 章中介绍过 form 表单登录配置,实际项目中以第 2 章介绍的配置方式为准,这里主要是演示 ObjectPostProcessor 的用法。