spring启动执行_执行器的Spring启动和安全性事件

spring启动执行

Spring Boot Actuator提供了审核功能,用于在启用了Spring Security的Spring Boot应用程序中发布和侦听与安全相关的事件。 默认事件是身份验证成功,身份验证失败和访问被拒绝,但是可以使用自定义事件进行扩展。

确保在项目中启用了Spring Boot Security和Actuator

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-security</artifactId>
</dependency>
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

执行器

默认情况下, /auditevents端点/auditevents启用状态,因此在启动应用程序(并使用应用程序日志中提供的用户名user和password登录)后,您可以看到当前的安全事件:

{"events": [{"timestamp": "2017-03-14T22:59:58+0000","principal": "user","type": "AUTHENTICATION_FAILURE","data": {"details": {"remoteAddress": "0:0:0:0:0:0:0:1","sessionId": null},"type": "org.springframework.security.authentication.BadCredentialsException","message": "Bad credentials"}},{"timestamp": "2017-03-14T23:00:07+0000","principal": "user","type": "AUTHENTICATION_SUCCESS","data": {"details": {"remoteAddress": "0:0:0:0:0:0:0:1","sessionId": null}}}]
}

/auditevents端点接受请求的可选参数:

  • pricipal -主体名称
  • after –事件发生后的日期,格式如下: yyyy-MM-dd'T'HH:mm:ssZ
  • type –事件类型(例如AUTHORIZATION_FAILURE,AUTHENTICATION_SUCCESS,AUTHENTICATION_FAILURE,AUTHENTICATION_SWITCH)

请求示例:

http:// localhost:8080 / auditevents?type = AUTHORIZATION_FAILURE&after = 2017-03-14T23%3A14%3A12%2B0000&principal = anonymousUser

端点实现使用org.springframework.boot.actuate.audit.AuditEventRepository返回所有已注册的审核事件。

  • 自定义/auditevents端点

您可以使用endpoints.auditevents.*属性来自定义端点。 例如,要更改审核事件端点的路径,只需使用endpoints.auditevents.path属性。

使用

安全事件由执行器中的org.springframework.boot.actuate.audit.AuditEvent值对象表示。 该对象包含时间戳,用户名,事件类型和事件数据。

获得有关审核事件的最简单方法是通过Spring的org.springframework.context.event.EventListener订阅org.springframework.boot.actuate.audit.listener.AuditApplicationEvent事件:

@Component
public class AuditApplicationEventListener {private static final Logger LOG = LoggerFactory.getLogger(AuditApplicationEventListener.class);@EventListenerpublic void onAuditEvent(AuditApplicationEvent event) {AuditEvent actualAuditEvent = event.getAuditEvent();LOG.info("On audit application event: timestamp: {}, principal: {}, type: {}, data: {}",actualAuditEvent.getTimestamp(),actualAuditEvent.getPrincipal(),actualAuditEvent.getType(),actualAuditEvent.getData());}
}

输出示例:

2017-03-15 00:44:12.921  INFO 13316 --- [nio-8080-exec-1] p.c.d.s.s.AuditApplicationEventListener  : On audit event: timestamp: Wed Mar 15 00:44:12 CET 2017, principal: user, type: AUTHENTICATION_SUCCESS, data: {details=org.springframework.security.web.authentication.WebAuthenticationDetails@b364: RemoteIpAddress: 0:0:0:0:0:0:0:1; SessionId: null}

异步事件

@EventListener是同步的,但是如果需要异步行为,则可以使用@Async注释事件侦听器方法,并确保启用了异步(例如,通过@EnableAsync ):

@Component
public class AuditApplicationEventListener {private static final Logger LOG = LoggerFactory.getLogger(AuditApplicationEventListener.class);@EventListener@Asyncpublic void onAuditEvent(AuditApplicationEvent event) {}
}

并配置:

@SpringBootApplication
@EnableAsync
public class Application {public static void main(String[] args) {SpringApplication.run(Application.class);}
}

使用

另外,您可以扩展org.springframework.boot.actuate.audit.listener.AbstractAuditListener并覆盖其org.springframework.boot.actuate.audit.listener.AbstractAuditListener#onAuditEvent方法:

@Component
public class AuditEventListener extends AbstractAuditListener {private static final Logger LOG = LoggerFactory.getLogger(AuditEventListener.class);@Overrideprotected void onAuditEvent(AuditEvent event) {LOG.info("On audit event: timestamp: {}, principal: {}, type: {}, data: {}",event.getTimestamp(),event.getPrincipal(),event.getType(),event.getData());}
}

注意:事件存储库中不会存储任何事件,因此/auditevents端点将始终返回空数组。 要解决此问题,您可以注入审核存储库,也可以直接从org.springframework.boot.actuate.audit.listener.AuditListener扩展:

@Component
public class AuditEventListener extends AbstractAuditListener {private static final Logger LOG = LoggerFactory.getLogger(AuditEventListener.class);@Autowiredprivate AuditEventRepository auditEventRepository;@Overrideprotected void onAuditEvent(AuditEvent event) {LOG.info("On audit event: timestamp: {}, principal: {}, type: {}, data: {}",event.getTimestamp(),event.getPrincipal(),event.getType(),event.getData());auditEventRepository.add(event);}
}

与事件发布者发布自己的审核事件

在下面的示例中,使用了应用程序事件发布者( org.springframework.context.ApplicationEventPublisher )来发布类型为CUSTOM_AUDIT_EVENT的自定义审核事件。 新的侦听器方法仅侦听那些新事件,而先前的方法将忽略它们(请注意,这只是一个示例)。 与其他事件一样,自定义事件将使用审核事件存储库进行存储。

@Component
public class AuditApplicationEventListener {private static final Logger LOG = LoggerFactory.getLogger(AuditApplicationEventListener.class);@Autowiredprivate ApplicationEventPublisher applicationEventPublisher;@EventListener(condition = "#event.auditEvent.type != 'CUSTOM_AUDIT_EVENT'")@Asyncpublic void onAuditEvent(AuditApplicationEvent event) {AuditEvent actualAuditEvent = event.getAuditEvent();LOG.info("On audit application event: timestamp: {}, principal: {}, type: {}, data: {}",actualAuditEvent.getTimestamp(),actualAuditEvent.getPrincipal(),actualAuditEvent.getType(),actualAuditEvent.getData());applicationEventPublisher.publishEvent(new AuditApplicationEvent(new AuditEvent(actualAuditEvent.getPrincipal(), "CUSTOM_AUDIT_EVENT")));}@EventListener(condition = "#event.auditEvent.type == 'CUSTOM_AUDIT_EVENT'")public void onCustomAuditEvent(AuditApplicationEvent event) {LOG.info("Handling custom audit event ...");}
}

注意示例代码

可以在spring-boot-thymeleaf存储库中找到本文的示例代码。 默认情况下,两个配置文件均禁用安全性。 通过更改application.propertiessecurity.basic.enabled属性来启用它。

翻译自: https://www.javacodegeeks.com/2017/03/spring-boot-security-events-actuator.html

spring启动执行

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

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

相关文章

系统运维包括哪些内容_智能养老系统包括哪些?养老管理系统内容详解

智慧养老成为养老产业新的发展热点&#xff0c;受到了社会各界的关注。智能养老系统利用先进的IT技术手段&#xff0c;开发面向居家养老、社区养老、机构养老的养老系统平台&#xff0c;提供实时、快捷、高效、物联化、智能化的养老服务&#xff0c;并将医疗服务、运营商、服务…

买了服务器之后如何操作系统,买了服务器之后如何操作系统

买了服务器之后如何操作系统 内容精选换一换如果您需要使用毕昇编译器&#xff0c;则需要先在服务端安装毕昇编译器。毕昇编译器基于开源LLVM开发&#xff0c;并进行了优化和改进&#xff0c;同时将flang作为默认的Fortran语言前端编译器&#xff0c;是针对鲲鹏平台的高性能编译…

敏捷中gwt含义_在GWT中序列化/反序列化Json

敏捷中gwt含义JSON和GWT 最近&#xff0c; GWT用户小组中进行了有趣的讨论 &#xff0c;涉及在客户端对JSON进行序列化/反序列化的最佳实践。 这篇文章旨在突出其重点。 到目前为止&#xff0c;在GWT中有三种将对象转换为JSON并从客户端转换回JSON的方法&#xff1a; gwt-jack…

图片高亮处理编程_GMT语法高亮-智能提示-代码补全插件

GMT(Generic Mappint Tools)是地学界应用非常广泛的一款绘图兼数据处理的开源软件。其开发团队也是非常活跃&#xff0c;此软件还在不断的发展和更新中&#xff0c;变得越来越强大。目前已经有164个模块&#xff0c;而每一个模块又有很多命令参数。因为gmt是命令行软件&#xf…

超时空机战服务器配置信息错误,超时空机战熔炉篇FAQ教你如何合理的使用熔炉...

在超时空机战这款游戏中&#xff0c;有一处是叫做熔炉的地方&#xff0c;在其中可以分解物品得到其他的物品&#xff0c;可是怎么才能更好的利用熔炉分解物品达到资源合理利用的地步呢&#xff0c;接下来就和小编一起分析一下吧。1.什么是熔炉&#xff0c;熔炉在哪里可以找到?…

ASCII编码/Unicode编码

码位与字符的对照关系表&#xff08;编码字符集&#xff09; ASCII 码表&#xff0c;American Standard Code for Information Interchange&#xff0c;美国信息交换标准代码 Unicode 码表&#xff0c;万国码&#xff0c;几乎全球国家的字符都可以表示&#xff0c;也是用来表示…

tdd 单元测试_何时给定在单元测试和TDD中的重要性

tdd 单元测试最近&#xff0c;我一直在写与自动测试有关的更高级的概念&#xff08;主要与Spock有关&#xff09;。 但是&#xff0c;在进行测试培训时&#xff0c;我清楚地看到&#xff0c;通常对特定工具的知识并不是主要问题。 即使使用Spock&#xff0c;也可以编写肿且难以…

java 设计模式_Java设计模式的常见应用场景

一、Java I/O中的设计模式1、适配器模式适配器模式就是把一个类的接口变换成客户端所能接受的另一种接口&#xff0c;从而使两个接口不匹配而无法在一起工作的两个类能够在一起工作。通常被用在一个项目需要引用一些开源框架来一起工作时&#xff0c;这些框架的内部都有一些关于…

abaqus实例_使用Python在ABAQUS中创建XYData数据

这篇的正题是要讲一个愚蠢的小故事&#xff0c;无奈之举&#xff0c;恐成笑柄。但是从PythonAbaqus前后处理的角度讲&#xff0c;还是有点意义的&#xff0c;所以才敢拿出来献丑。三年航天器型号研制工作干下来&#xff0c;积累了不少陋习&#xff0c;但内心还是想努力克服的。…

常量和字面量的区别

字面量 是指由字母&#xff0c;数字等构成的字符串或者数值&#xff0c;它只能作为右值出现&#xff0c;所谓右值是指等号右边的值&#xff0c;如&#xff1a;int a123这里的a为左值&#xff0c;123为右值。 常量 常量和变量都属于变量&#xff0c;只不过常量是赋过值后不能…

java学习笔记_Java学习笔记day11

Map集合java.util.Map<k,v>集合 Map集合特点&#xff1a; 1.Map集合是一个双列集合&#xff0c;一个元素包含两个值(一个key&#xff0c;一个value) 2.Map集合中的元素&#xff0c;key和value的数据类型可以相同&#xff0c;也可以不同 3.Map集合中掉元素&#xff0c;key…

slice_Spring Boot Web Slice测试–示例

sliceSpring Boot 引入了一段时间的测试切片 &#xff0c;花了我一些时间来研究它并探索它的一些细微差别。 背景 使用此功能的主要原因是减少样板。 考虑一个看起来像这样的控制器&#xff0c;仅适用于使用Kotlin编写的各种控制器。 RestController RequestMapping("/u…

几点减几点怎么列算式_[股票一般几点可以买入]股票缩量怎么买 | 爱淘股吧

股票一般买入绝技——缩量调整突破买入股票缩量怎么买下面就来详细说说几个买入绝技&#xff1a;第一种&#xff1a;伴随着成交量的缩减。(2)在缩量调整到尾声之后&#xff0c;突然出现一根放量大阳线。(3)大阳线的出现伴随着成交量的放大。其下一个交易日如果股价继续放量上攻…

Java关键字和标识符

public class HelloWorld { // public、class 是关键字&#xff0c;HelloWorld是标识符public static void main(String[] args) { // public、static、void是关键字&#xff0c;main、String、args是标识符System.out.println("Hello,World!"); // System、out、pri…

python可视化水平双向箭头_python数据可视化第二弹

代码模板&#xff1a;最前面importpandas as pdpd.plotting.register_matplotlib_converters()importmatplotlib.pyplot as plt%matplotlib inlineimportseaborn as snsprint("Setup Complete")View Code一、折线图Line chartsplt.figure(figsize(14,6))#Add titlepl…

扩展 junit 框架_JUnit 5扩展模型的生命周期

扩展 junit 框架JUnit5最终版本即将来临 &#xff08;当前是M4&#xff09;&#xff0c;我已经开始尝试如何编写扩展了。 在JUnit5中 &#xff0c;您没有使用Runners &#xff0c; Rules &#xff0c; ClassRules等&#xff0c;而是只有一个Extension API来实现自己的扩展。 …

mqtt服务器数据存储位置,mqtt服务器 数据库

mqtt服务器 数据库 内容精选换一换云服务器备份&#xff1a;云服务器备份可以对普通服务器进行整机备份或部分磁盘备份&#xff0c;不适用于部署了数据库等应用的服务器。支持备份弹性云服务器ECS和裸金属服务器BMS&#xff0c;成本相对于VBS较高&#xff0c;适合对需要备份整个…

固体加热_干货分享| |固体氧化物燃料电池

固体氧化物燃料电池属于第三代燃料电池&#xff0c;是一种在中高温下直接将储存在燃料和氧化剂中的化学能高效、环境友好地转化成电能的全固态化学发电装置。被普遍认为是在未来会与质子交换膜燃料电池一样得到广泛普及应用的一种燃料电池。一般的固体氧化物燃料电池发电系统包…

poi设置列宽自适应_Sentinel 系统自适应限流原理剖析与实战指导

1、Sentinel 系统自适应概述从官方了解到 Sentienl 系统自适应限流是一个全局的概念&#xff0c;对应用入口流量统一进行统一控制&#xff0c;结合应用的机器负载、CPU 使用率&#xff0c;总体平均响应时间、入口 QPS 和并发线程数等几个维度的监控指标从而决定是否调用进行限流…

路径和目录的区别

路径&#xff1a; 终点是目标文件&#xff0c;才叫路径&#xff0c;举例&#xff1a;/Users/liaowenxiong/Downloads/SoftWare for Mac/liaowenxiong.txt 这里的终点就是txt文件&#xff0c;这叫路径&#xff0c;路径是可以直接找到目标文件的。 目录&#xff1a; 终点是文件夹…