SpringSecurity(Authorization Events)

Authorization Events

对于每个被拒绝的授权,都会激发一个 AuthorizationDeniedEvent。此外,还可以为授予的授权激发 AuthorizationGrantedEvent。

若要侦听这些事件,必须首先发布 AuthorizationEventPublisher。

Spring Security 的 SpringAuthorizationEventPublisher 可能会做得很好。它使用 Spring 的 ApplicationEventPublisher 发布授权事件:

@Bean
public AuthorizationEventPublisher authorizationEventPublisher(ApplicationEventPublisher applicationEventPublisher) {return new SpringAuthorizationEventPublisher(applicationEventPublisher);
}

然后,您可以使用 Spring 的@EventListener 支持:

@Component
public class AuthenticationEvents {@EventListenerpublic void onFailure(AuthorizationDeniedEvent failure) {// ...}
}

Authorization Granted Events

因为 AuthorizationGrantedEvents 有可能非常嘈杂,所以默认情况下不发布它们。

事实上,发布这些事件可能需要您自己的一些业务逻辑,以确保应用程序不会被嘈杂的授权事件淹没。

您可以创建自己的事件发布者来筛选成功事件。例如,下面的发布者只在需要 ROLE _ ADMIN 的地方发布授权:

@Component
public class MyAuthorizationEventPublisher implements AuthorizationEventPublisher {private final ApplicationEventPublisher publisher;private final AuthorizationEventPublisher delegate;public MyAuthorizationEventPublisher(ApplicationEventPublisher publisher) {this.publisher = publisher;this.delegate = new SpringAuthorizationEventPublisher(publisher);}@Overridepublic <T> void publishAuthorizationEvent(Supplier<Authentication> authentication,T object, AuthorizationDecision decision) {if (decision == null) {return;}if (!decision.isGranted()) {this.delegate.publishAuthorizationEvent(authentication, object, decision);return;}if (shouldThisEventBePublished(decision)) {AuthorizationGrantedEvent granted = new AuthorizationGrantedEvent(authentication, object, decision);this.publisher.publishEvent(granted);}}private boolean shouldThisEventBePublished(AuthorizationDecision decision) {if (!(decision instanceof AuthorityAuthorizationDecision)) {return false;}Collection<GrantedAuthority> authorities = ((AuthorityAuthorizationDecision) decision).getAuthorities();for (GrantedAuthority authority : authorities) {if ("ROLE_ADMIN".equals(authority.getAuthority())) {return true;}}return false;}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/869475.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

编译Linux内核, 制作迷你系统并在虚拟机里运行(2)

编译制作环境&#xff1a;ubuntu20.0.4 一&#xff0c;参考文档 Linux 系统裁剪--制作一个最小化的Linux iso镜像 https://blog.csdn.net/alfiy/article/details/122568957 按照上述文档的步骤&#xff0c;制作的iso启动不了&#xff0c;经过多次尝试&#xff0c;发现生成的…

【Go - 常见的5类函数用法】

函数 函数通过func关键字定义&#xff0c;后跟函数名、参数列表、返回类型。语法如下&#xff1a; func functionName(parameters) returnType {// 函数体 }示例 func add(x int, y int) int {return x y }func swap(x, y string) (string, string) {return y, x }变参函数…

电脑虚拟摄像头怎么使用?电脑摄像头可以被虚拟摄像头替代吗?8款推荐!

在数字化日益普及的今天&#xff0c;视频通话和在线会议已成为我们生活和工作中不可或缺的一部分。然而&#xff0c;当我们的电脑没有配备摄像头&#xff0c;或摄像头出现故障时&#xff0c;我们可能会面临一些不便。这时&#xff0c;电脑虚拟摄像头便成为了一个实用的解决方案…

C# 策略模式(Strategy Pattern)

策略模式定义了一系列的算法&#xff0c;并将每一个算法封装起来&#xff0c;使它们可以相互替换。策略模式让算法的变化独立于使用算法的客户。 // 策略接口 public interface IStrategy { void Execute(); } // 具体策略A public class ConcreteStrategyA : IStra…

前端面试题37(js递归)

在JavaScript中&#xff0c;递归是一种编程技术&#xff0c;它允许函数调用自身来解决问题。这种方法通常用于处理分治策略的算法&#xff0c;比如遍历树形结构、计算阶乘、 Fibonacci数列等。下面通过几个示例来说明如何使用递归。 1. 计算阶乘 阶乘是一个经典的递归示例&am…

[激光原理与应用-102]:南京科耐激光-激光焊接-焊中检测-智能制程监测系统IPM介绍 - 6 - 激光焊接系统的组成

目录 一、激光焊接系统的组成概述 1.1、核心部件 1.2、焊接执行部件 1.3、辅助系统 1.4、控制系统 1.5、其他辅助设备 二、激光器 2.1 按出光类型分 1. 脉冲激光器 2. 连续激光器 3. 准连续激光器&#xff08;QCW&#xff09; 4. 其他常见激光器 5. 应用领域 2.2…

SDK游戏盾、高防IP和高防CDN有什么区别

SDK 游戏盾、高防 IP 和高防 CDN 主要有以下区别&#xff1a; SDK 游戏盾&#xff1a; • 原理&#xff1a;通常需要集成到游戏应用程序中&#xff0c;通过在游戏客户端和服务器之间建立加密通道和智能调度&#xff0c;实现对游戏的防护。 • 特点&#xff1a;能更深入地与游…

C 语言中如何进行冒泡排序?

&#x1f345;关注博主&#x1f397;️ 带你畅游技术世界&#xff0c;不错过每一次成长机会&#xff01; &#x1f4d9;C 语言百万年薪修炼课程 通俗易懂&#xff0c;深入浅出&#xff0c;匠心打磨&#xff0c;死磕细节&#xff0c;6年迭代&#xff0c;看过的人都说好。 文章目…

JVM内存泄露的ThreadLocal详解

目录 一、为什么要有ThreadLocal 二、ThreadLocal的使用 三、实现解析 实现分析 具体实现 Hash冲突的解决 开放定址法 链地址法 再哈希法 建立公共溢出区 四、引发的内存泄漏分析 内存泄漏的现象 分析 总结 错误使用ThreadLocal导致线程不安全 一、为什么要有Thr…

Qt开发 | Qt绘图技术 | 常见图像绘制 | Qt移动鼠标绘制任意形状 | Qt绘制带三角形箭头的窗口

文章目录 一、基本绘图技术介绍二、常见的18种图形、路径、文字、图片绘制三、Qt移动鼠标绘制任意形状四、Qt绘制带三角形箭头的窗口 一、基本绘图技术介绍 Qt提供了绘图技术&#xff0c;程序员可以在界面上拖动鼠标&#xff0c;或者在代码里指定参数进行绘图。 Qt绘图技术介绍…

如何在 C 语言中实现链表?

&#x1f345;关注博主&#x1f397;️ 带你畅游技术世界&#xff0c;不错过每一次成长机会&#xff01; &#x1f4d9;C 语言百万年薪修炼课程 通俗易懂&#xff0c;深入浅出&#xff0c;匠心打磨&#xff0c;死磕细节&#xff0c;6年迭代&#xff0c;看过的人都说好。 文章目…

vue子组件调用父组件方法

父组件 页面<popoverss ref"pop" :goodspop"goodspop"></popoverss>子组件components: {"popoverss": () > import(../comm/popover.vue)},方法goodspop(e){console.log(e"----")return 9999;},子组件 方法props:[go…

习题练习以

题意&#xff1a;求i&M的popcount的和&#xff0c;i属于0……N 主要思路还是变加为乘。 举个例子N22&#xff0c;即10110 假设M的第3位是1&#xff0c;分析N中&#xff1a; 00110 00111 00100 00101 发现其实等价于 0010 0011 0000 0001 也就是左边第4位和第5…

《AIGC:智能创作时代》:AI创作革命来临,你准备好了吗?

想象一下&#xff0c;你正在欣赏一幅精美的画作&#xff0c;惊叹于其细腻的笔触和独特的构图。然而&#xff0c;当你得知这幅作品是由人工智能创作时&#xff0c;你会作何感想&#xff1f;这不再是科幻小说中的场景&#xff0c;而是我们正在经历的现实。 在这个AI技术飞速发展的…

QListWidget、QTreeWidget、QTableWidget的拖放

QListWidget、QTreeWidget、QTableWidget的拖放实验 QAbstractItemView::DragDropMode 的枚举值 QAbstractItemView::NoDragDrop0组件不支持拖放操作QAbstractItemView::DragOnly1组件只支持拖动操作QAbstractItemView::DropOnly 2组件只支持放置操作QAbstractItemView::DragDr…

AI 图像处理 --CodeFormer 简介

CodeFormer是一款基于深度学习技术&#xff0c;特别是利用自动编码器和VQGAN&#xff08;Vector Quantised Generative Adversarial Network&#xff09;进行人脸修复和视频增强的强大人工智能工具。它通过高分辨率重建和细节修复&#xff0c;显著提升了图像和视频的质量和视觉…

Django 视图 - FBV 与 CBV

Django 视图 - FBV 与 CBV 在 Django 框架中,视图是处理 Web 请求和返回 Web 响应的核心组件。Django 提供了两种主要的视图编写方式:函数基础视图(Function-Based Views,简称 FBV)和类基础视图(Class-Based Views,简称 CBV)。这两种方式各有特点,适用于不同的场景。…

WPF设置全局样式

目的 创建一个资源字典&#xff0c;自动引入到各个Window或者UserControl中&#xff0c;可以随意使用。或者引入多个控件包&#xff0c;为了做兼容&#xff0c;保证可以引用多个控件库。 1. 定义资源字典 首先&#xff0c;你需要创建一个XAML文件来定义你的资源字典&#xf…

Python中JSON处理技术的详解

引言 JSON&#xff08;JavaScript Object Notation&#xff09;作为当前最流行的数据传输格式&#xff0c;在Python中也有多种实现方式。由于JSON的跨平台性和简便易用性&#xff0c;它在数据交互中被广泛应用。本文将重点讨论如何熟练应用Python的JSON库&#xff0c;将JSON数…

生日判断星座【GO】

文章目录 星座列表生日转换为星座 星座列表 const (Aries "aries"Taurus "taurus"Gemini "gemini"Cancer "cancer"Leo "leo"Virgo "virgo"Libra "libra&q…