当前位置: 首页 > 知识库问答 >
问题:

记住MeAuthenticationFilter和Java配置:重写onSuccessfulAuthentication的自定义实现--如何以干净的方式实现?

贝研
2023-03-14

RemembermeAuthenticationFilter提供AuthenticationAuthenticationFilterAuthenticationAuthentication会破坏筛选器链,因此我希望通过提供RemembermeAuthenticationFilter的自定义实现来重写其OnSuccessfulAuthentication但是当使用简单的Java配置时,这似乎相当复杂或复杂。

如果需要访问HttpServletRequestHttpServletResponse,则提供ApplicationEventPublisher不是解决方案。

我设法做到了,但这看起来像一个黑客--有更好的方法吗?

我是这样做的:

http.rememberMe().addObjectPostProcessor(new ObjectPostProcessor<RememberMeAuthenticationFilter>() {

    @Override
    public <O extends RememberMeAuthenticationFilter> O postProcess(O object) {

        RememberMeAuthenticationFilter newFilter = new RememberMeAuthenticationFilter(
                (AuthenticationManager) getByReflection(object, "authenticationManager"),
                (RememberMeServices) getByReflection(object, "rememberMeServices")
        ) {
            @Override
            protected void onSuccessfulAuthentication(HttpServletRequest request, HttpServletResponse response, Authentication authResult) {
                // business logic
            }
        };
        return (O) newFilter;
    }

    private <O extends RememberMeAuthenticationFilter> Object getByReflection(O object, String name) {
        Field field = ReflectionUtils.findField(object.getClass(), name);
        ReflectionUtils.makeAccessible(field);
        return ReflectionUtils.getField(field, object);
    }
});

共有1个答案

周楷
2023-03-14

如果您希望在身份验证过程(使用remember me特性)成功时实现自定义行为,可以尝试:

定义新筛选器,例如:

public class CustomRememberMeAuthenticationFilter extends RememberMeAuthenticationFilter {
  @Override
  protected void onSuccessfulAuthentication(final HttpServletRequest request, final HttpServletResponse response, final Authentication authResult) {
    super.onSuccessfulAuthentication(request, response, authResult);
    if (authResult != null) {
        // process post authentication logic here..
    }
  }
}

在安全链中设置客户filer:

@Override
protected void configure(HttpSecurity http) throws Exception {
  http
    .csrf().disable()
    .authorizeRequests()
    .antMatchers("/","/login*").permitAll()
    //...
  http
    .addFilter(rememberMeAuthenticationFilter())
    //...
}

@Bean
protected RememberMeAuthenticationFilter rememberMeAuthenticationFilter(){
    return new CustomRememberMeAuthenticationFilter(authenticationManager(),rememberMeServices());
}
    null
 类似资料:
  • 比如 其实相当于 代码不需要手动处理就可以执行。

  • 在我们的Spring Boot应用程序中,我们使用Spring Cloud AWS: Spring-Cloud-Starter-AWS Spring-Cloud-AWS-AutoConfigure Spring-Cloud-AWS-Messaging 若要从SQS队列接收消息,请执行以下操作。然而,我们需要能够启动应用程序,即使队列不可访问(即“(服务:AmazonSQS;状态代码:403;错误代

  • 本文向大家介绍TensorFlow实现自定义Op方式,包括了TensorFlow实现自定义Op方式的使用技巧和注意事项,需要的朋友参考一下 『写在前面』 以CTC Beam search decoder为例,简单整理一下TensorFlow实现自定义Op的操作流程。 基本的流程 1. 定义Op接口 2. 为Op实现Compute操作(CPU)或实现kernel(GPU) 3. 将实现的kernel

  • 问题内容: 这是我的问题:我有一个对话框,其中包含一些用户可以更改的参数(例如,通过微调器)。每次更改这些参数之一时,我都会启动一个线程以根据新的参数值更新3D视图。如果在第一个线程正在工作时用户更改了另一个值(或通过单击微调箭头多次再次更改了相同的值),我想中止第一个线程(以及3D视图的更新)并启动一个新线程具有最新的参数值。 我该怎么做? PS:我的线程的方法中没有循环,因此检查标志不是一个选

  • 我需要实现我的自定义DefaultComboxModel。这样做的原因是每次我打电话给 或者 或者 我看到它自动触发一个项目状态更改事件。这会导致一些随机项目自动从列表中选择。这不是我想要的,因为它用随机选择的项目填充可编辑的JTextField。 这是我在使用我的自定义Itemlistener中的Thread.dumpStack()进行调试时看到的stacktrace,它是我在调用上述方法时看到

  • 本文向大家介绍Java如何实现自定义异常类,包括了Java如何实现自定义异常类的使用技巧和注意事项,需要的朋友参考一下 这篇文章主要介绍了Java如何实现自定义异常类,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 自定义异常类步骤   创建一个类继承异常父类Exception   在具体的实现方法首部抛出异常类(自己创建的那个类),throws的