Spring Security Oauth2 AuthenticationSuccessEvent 在每个请求时发布

2024-03-03

我正在使用 Spring Security Oauth2 来保护我的 Spring Boot REST 应用程序。我想在用户登录成功和失败后处理一些操作。问题是每个 当我使用用户不记名令牌发送请求时,AuthenticationSuccessEvent即使用户已经通过身份验证,也会发布。

该处理程序始终被调用:

@Async
@EventListener( { AuthenticationSuccessEvent.class } )
public void listenAuthenticationSuccessEvent( AuthenticationSuccessEvent event ) {
    AbstractAuthenticationToken auth = (AbstractAuthenticationToken) event
            .getSource();
    log.info( "User connected: {}", auth.getName() );
}

正常吗?我希望它被调用一次。

感谢您的帮助


原因是认证成功事件默认情况下(从 Spring 5.x 开始)在每个 token/refresh_token 上调用事件是因为“授权:基本clientID:clientSecret”标头作为令牌请求的一部分呈现,因此请求由基本认证过滤器以及使用相应的身份验证客户端身份验证管理器(提供者管理器)(除了提供者管理器负责令牌验证)的实现。

Each 提供者管理器,反过来,有认证事件发布者用于发布不同类型事件的依赖项,在我们的例子中(auth success),它是eventPublisher.publishAuthenticationSuccess(结果);

默认情况下提供者管理器 uses 空事件发布者可以使用覆盖ProviderManager#setAuthenticationEventPublisher setter.

提供者管理器是由创建的'认证管理器生成器为其设置相应的事件发布者(如果不为空)。

protected ProviderManager performBuild() throws Exception {
...
ProviderManager providerManager = new ProviderManager(authenticationProviders,
        parentAuthenticationManager);
...
if (eventPublisher != null) {
   providerManager.setAuthenticationEventPublisher(eventPublisher);
}

AuthenticationManagerBuilder 填充自Web安全配置适配器 see WebSecurityConfigurerAdapter#getHttp方法中您可以找到以下行(在 Spring Security 5.x 中添加):

authenticationBuilder.authenticationEventPublisher(eventPublisher);

覆盖该默认行为的方法之一是实现相应的 BasicWebSecurityConfig(扩展 WebSecurityConfigurerAdapter 或 AuthorizationServerSecurityConfiguration)并将 NullEventPublisher 设置为'认证管理器生成器 before 提供者管理器创建:

@Configuration
@Order(-1)
public class BasicSecurityConfiguration extends AuthorizationServerSecurityConfiguration {
@Override
protected void configure(HttpSecurity http) throws Exception {
    super.configure(http);

    // override default DefaultAuthenticationEventPublisher to avoid excessive firing of
    // AuthenticationSuccessEvent on successful client credentials verification that passed in "Authorization: Basic clientId:clientSecret" header
    http.getSharedObject(AuthenticationManagerBuilder.class).authenticationEventPublisher(new NullEventPublisher());
    http.httpBasic()
}

private static final class NullEventPublisher implements AuthenticationEventPublisher {
    public void publishAuthenticationFailure(AuthenticationException exception, Authentication authentication) {
    }

    public void publishAuthenticationSuccess(Authentication authentication) {
    }
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Spring Security Oauth2 AuthenticationSuccessEvent 在每个请求时发布 的相关文章

随机推荐

  • 如何使引导轮播图像响应?

    我想保持图像的相同比例 问题是当浏览器很宽时它会拉伸 并在减少时挤压 我在这里检查了所有问题 但大多数问题都没有帮助我 这里是markup div class carousel slide ol class carousel indicat
  • 为什么我的简单严格 XHTML 文件在包含 jquery 时会出错?

    我正在尝试制作一个包含 jquery 的简单严格的 HTML 文件
  • 使用 Qt Quick 创建可扩展的光泽按钮

    我想使用 Qt Quick 创建下面的光泽按钮 最好使用纯 QML 无 C 它需要可扩展 所以我不能使用PNG等 到目前为止我的代码 import QtQuick 2 3 import QtQuick Controls 1 2 import
  • 如何在 tmux 中使用 Ctrl-分号作为前缀?

    我想使用 Ctrl 分号作为 tmux 的前缀 但我的conf不起作用 unbind key C b set option g prefix C 我发现了一篇类似的文章 但这不是前缀 tmux 绑定分号 https stackoverflo
  • 使用 Automapper 忽略子类映射中的基类属性的问题

    我有一个场景 我想忽略基类中定义的类的某些属性 我有一个像这样的初始映射 Mapper CreateMap
  • C++:((A*)nullptr)->foo();合法吗?

    在深入研究 MFC 时 我发现了这段代码 AFXWIN INLINE HWND CWnd GetSafeHwnd const return this NULL NULL m hWnd 好像是这样使用的 CWnd pWnd nullptr p
  • 向左旋转 verilog 大小写

    我的任务是用verilog编写一个16位ALU 当我做需要旋转操作数和进行2的补码加法和减法的部分时 我发现了困难 我知道如何用纸和铅笔解决这个问题 但我无法弄清楚如何在 Verilog 中做到这一点 例如 A表示为a15 a14 a13
  • 字符串和标签本地化和全球化的最佳实践[关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我是一个拥有 20 多名开发人员的团队的成员 每个开发人员都在一个单独的模块上工作 大约 10 个模块 在每个模块中 我们可能至少有 50 个
  • 如何安装依赖于另一个“目标项目”包的包?

    我在设置 yeoman 时遇到问题 当我尝试安装某些软件包 yeoman compass 时 我不断收到此错误 同时 其他软件包安装良好 git python 外部包不能依赖于目标项目的包 我不确定失败在哪里 但是 nuget 有一个长期存
  • 测试本地时清单中的代码库属性不匹配

    根据 Java 1 7u25 你应该添加Codebase归因于你的清单 我已经做到了 但现在我无法在本地测试它 因为属性值与我的本地 JNLP 由 Netbeans 生成 不匹配 它没有代码库值 清单的代码库应该有什么价值和 或我的 jnl
  • 反应式香蕉节流事件

    我想在reactive banana 中实现某种类型的事件限制 它应该工作 以便如果距最后一个事件通过的时间少于 delta 秒 则不会让事件通过 如果不让其通过 则会存储该事件 并在距离上次触发事件 delta 秒后触发 下面是一个为时间
  • 需要一种算法来像素化 n 维超球面

    我想将向量放入 n 维空间中 这可以通过对 n 维超球面的表面进行像素化来完成 有谁知道用 C 语言对超球面进行像素化有什么好的算法吗 我想要恒定的垃圾箱大小 我的空间仅由正整数组成 您需要您的垃圾箱完全规则吗 如果不是 则随机抛出点 并测
  • 按因子列安全合并数据框

    因子可以帮助防止 R 中的某些编程错误 您无法对使用不同级别的因子执行相等检查 并且在对无序因子执行大于 小于检查时会收到警告 a lt factor letters 1 3 b lt factor letters 1 3 levels l
  • Doctrine 2.0 select查询问题?

    我的朋友 我是 DOctrine 2 0 的新手 我已经配置了 但它不起作用 我有一张桌子 abctable 在数据库中 xyzdb id name age 1 Abc 23 2 Ijk 21 3 Mno 32 Table name abc
  • Visual Studio 装饰扩展事件未被触发

    我正在尝试为我的视觉工作室插件创建一个基本的装饰功能 我已经有一个工具窗口和一些命令设置 我正在尝试让 adronment 工作 按照此走过 https msdn microsoft com en us library ee818135 a
  • Django 1.9 import_module 的导入错误

    当尝试运行任一runserver or shell using manage py我得到一个ImportError例外 我正在使用 Django 1 9 ImportError No module named django utils im
  • Android安装-sdk manager.exe不起作用

    我从developer android com安装了适用于Windows的android SDK installer r08 windows exe 我安装到默认位置 C Program Files Android android sdk
  • Java Spring Boot 的 Docker 基础镜像(`FROM`)是什么?

    什么 Docker 基础镜像 FROM 对于 Java Spring Boot 应用程序 我刚刚开始使用 docker 我看到了FROM inside Dockerfile可以为Java定义图像 例如 FROM java 8 如果我使用 G
  • 405 不允许的方法

    我试图访问https api box com 2 0 files但我收到Expected status code in 200 299 got 405在我的回复中 来自 AFNetworking 在发送请求之前 我已从服务器获取了我的 au
  • Spring Security Oauth2 AuthenticationSuccessEvent 在每个请求时发布

    我正在使用 Spring Security Oauth2 来保护我的 Spring Boot REST 应用程序 我想在用户登录成功和失败后处理一些操作 问题是每个 当我使用用户不记名令牌发送请求时 AuthenticationSucces