我想跟踪Spring Boot / OAuth2 / Java Config设置中的某些内容并在某处报告(请考虑AWS CloudWatch,或Google Analytics或任何其他类似服务)。 更确切地说,我有一个带有Spring OAuth2的授权+资源服务器。
我想跟踪的内容将是(但不限于):
我计划添加javax.servlet.Filters
,但在使用我的授权服务器记录失败尝试时(使用@EnableAuthorizationServer
并扩展AuthorizationServerConfigurerAdapter
),它会变得毛茸茸。我想我需要使用我的自定义异常转换器,或者想出如何在ClientCredentialsTokenEndpointFilter
中设置/包装AuthenticationManager。
有没有比收集大量东西更好的方法来收集我上面提到的信息?
更新
正如我在评论中提到的,我不是在寻找"日志转储"。我需要能够获得例如尝试登录但失败的用户ID,或者使用的无效访问令牌等。
我研究了自己的ApplicationListener<ApplicationEvent>
编码,检测AuthenticationFailureBadCredentialsEvent
之类的东西并走了那条路。
例如,我可以检测到BadCredentialsException
,但是需要弄清楚它是否是InvalidTokenException或其他(这是BadCredentialsException
的原因)。
下一个问题是我无法提取已使用和失败的访问令牌。感觉很尴尬,比你应该更多的黑客。
我不介意像那些经历那样的箍,只是想知道是否有更好的方法。
UPDATE2:
有一件事有助于&#34;倾听&#34;在Spring应用程序中发生了什么,它是ApplicationListener
。
发布的任何事件都可以通过提供该接口的实现来捕获。
InteractiveAuthenticationSuccessEvent
在客户端成功进行身份验证时发布(即clientId存在且密钥有效)AuthenticationSuccessEvent
AuthenticationFailureBadCredentialsEvent
在用户验证失败时发布。#2和#3存在问题,因为在ProviderManager中默认设置了NullEventPublisher,因此我必须更改我的(Java)配置以获取这些身份验证事件:
@Configuration
@EnableWebSecurity
public class WebSecurityConfiguration extends WebSecurityConfigurerAdapter {
...
@Autowired
private AuthenticationEventPublisher authenticationEventPublisher;
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth
.authenticationEventPublisher(authenticationEventPublisher)
...
}
...
}
现在,当客户端验证失败时,仍然存在接收事件的问题。
InteractiveAuthenticationSuccessEvent
由AbstractAuthenticationProcessingFilter
(ClientCredentialsTokenEndpointFilter
扩展)在成功验证后触发。但是,当身份验证失败时,它不会发布任何事件(因为至少版本3.0.0到4.0.1)。
另一种方法是通过设置非AuthenticationManager
,以与我上面相同的方式配置NullEventPublisher
,但据我所知,无法设置{{} 1}}在Spring Boot中没有手动设置宇宙???
答案 0 :(得分:2)
你可以在春天使用AOP。创建建议@Before
,@After
,@Arround
执行方法,甚至AfterThrowing
以检测发生的任何异常。
使用此方法,您可以将审计流程与业务逻辑分开。