测试Spring Boot / Java Config Application的最佳方法

时间:2015-07-30 16:01:17

标签: java spring spring-boot spring-security-oauth2 spring-java-config

我想跟踪Spring Boot / OAuth2 / Java Config设置中的某些内容并在某处报告(请考虑AWS CloudWatch,或Google Analytics或任何其他类似服务)。 更确切地说,我有一个带有Spring OAuth2的授权+资源服务器。

我想跟踪的内容将是(但不限于):

  • 登录失败尝试(针对客户端和用户)
  • 登录成功尝试(针对客户和用户)
  • REST控制器的使用(例如" / say_hello_world")
  • 例外(除了身份验证之外)

我计划添加javax.servlet.Filters,但在使用我的授权服务器记录失败尝试时(使用@EnableAuthorizationServer并扩展AuthorizationServerConfigurerAdapter),它会变得毛茸茸。我想我需要使用我的自定义异常转换器,或者想出如何在ClientCredentialsTokenEndpointFilter中设置/包装AuthenticationManager。

有没有比收集大量东西更好的方法来收集我上面提到的信息?

更新

正如我在评论中提到的,我不是在寻找"日志转储"。我需要能够获得例如尝试登录但失败的用户ID,或者使用的无效访问令牌等。

我研究了自己的ApplicationListener<ApplicationEvent>编码,检测AuthenticationFailureBadCredentialsEvent之类的东西并走了那条路。 例如,我可以检测到BadCredentialsException,但是需要弄清楚它是否是InvalidTokenException或其他(这是BadCredentialsException的原因)。 下一个问题是我无法提取已使用和失败的访问令牌。感觉很尴尬,比你应该更多的黑客。

我不介意像那些经历那样的箍,只是想知道是否有更好的方法。

UPDATE2:

有一件事有助于&#34;倾听&#34;在Spring应用程序中发生了什么,它是ApplicationListener。 发布的任何事件都可以通过提供该接口的实现来捕获。

  1. InteractiveAuthenticationSuccessEvent在客户端成功进行身份验证时发布(即clientId存在且密钥有效)
  2. 当用户成功进行身份验证(即用户名存在且密码匹配)时,会发布
  3. AuthenticationSuccessEvent
  4. AuthenticationFailureBadCredentialsEvent在用户验证失败时发布。
  5. #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)
              ...
        }
        ...
    }
    

    现在,当客户端验证失败时,仍然存在接收事件的问题。

    InteractiveAuthenticationSuccessEventAbstractAuthenticationProcessingFilterClientCredentialsTokenEndpointFilter扩展)在成功验证后触发。但是,当身份验证失败时,它不会发布任何事件(因为至少版本3.0.04.0.1)。

    另一种方法是通过设置非AuthenticationManager,以与我上面相同的方式配置NullEventPublisher,但据我所知,无法设置{{} 1}}在Spring Boot中没有手动设置宇宙???

1 个答案:

答案 0 :(得分:2)

你可以在春天使用AOP。创建建议@Before@After@Arround执行方法,甚至AfterThrowing以检测发生的任何异常。 使用此方法,您可以将审计流程与业务逻辑分开。