events.adoc 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166
  1. [[servlet-events]]
  2. = Authentication Events
  3. For each authentication that succeeds or fails, a `AuthenticationSuccessEvent` or `AuthenticationFailureEvent`, respectively, is fired.
  4. To listen for these events, you must first publish an `AuthenticationEventPublisher`.
  5. Spring Security's `DefaultAuthenticationEventPublisher` works fine for this purpose:
  6. [tabs]
  7. ======
  8. Java::
  9. +
  10. [source,java,role="primary"]
  11. ----
  12. @Bean
  13. public AuthenticationEventPublisher authenticationEventPublisher
  14. (ApplicationEventPublisher applicationEventPublisher) {
  15. return new DefaultAuthenticationEventPublisher(applicationEventPublisher);
  16. }
  17. ----
  18. Kotlin::
  19. +
  20. [source,kotlin,role="secondary"]
  21. ----
  22. @Bean
  23. fun authenticationEventPublisher
  24. (applicationEventPublisher: ApplicationEventPublisher?): AuthenticationEventPublisher {
  25. return DefaultAuthenticationEventPublisher(applicationEventPublisher)
  26. }
  27. ----
  28. ======
  29. Then you can use Spring's `@EventListener` support:
  30. [tabs]
  31. ======
  32. Java::
  33. +
  34. [source,java,role="primary"]
  35. ----
  36. @Component
  37. public class AuthenticationEvents {
  38. @EventListener
  39. public void onSuccess(AuthenticationSuccessEvent success) {
  40. // ...
  41. }
  42. @EventListener
  43. public void onFailure(AbstractAuthenticationFailureEvent failures) {
  44. // ...
  45. }
  46. }
  47. ----
  48. Kotlin::
  49. +
  50. [source,kotlin,role="secondary"]
  51. ----
  52. @Component
  53. class AuthenticationEvents {
  54. @EventListener
  55. fun onSuccess(success: AuthenticationSuccessEvent?) {
  56. // ...
  57. }
  58. @EventListener
  59. fun onFailure(failures: AbstractAuthenticationFailureEvent?) {
  60. // ...
  61. }
  62. }
  63. ----
  64. ======
  65. While similar to `AuthenticationSuccessHandler` and `AuthenticationFailureHandler`, these are nice in that they can be used independently from the servlet API.
  66. == Adding Exception Mappings
  67. By default, `DefaultAuthenticationEventPublisher` publishes an `AuthenticationFailureEvent` for the following events:
  68. |============
  69. | Exception | Event
  70. | `BadCredentialsException` | `AuthenticationFailureBadCredentialsEvent`
  71. | `UsernameNotFoundException` | `AuthenticationFailureBadCredentialsEvent`
  72. | `AccountExpiredException` | `AuthenticationFailureExpiredEvent`
  73. | `ProviderNotFoundException` | `AuthenticationFailureProviderNotFoundEvent`
  74. | `DisabledException` | `AuthenticationFailureDisabledEvent`
  75. | `LockedException` | `AuthenticationFailureLockedEvent`
  76. | `AuthenticationServiceException` | `AuthenticationFailureServiceExceptionEvent`
  77. | `CredentialsExpiredException` | `AuthenticationFailureCredentialsExpiredEvent`
  78. | `InvalidBearerTokenException` | `AuthenticationFailureBadCredentialsEvent`
  79. |============
  80. The publisher does an exact `Exception` match, which means that sub-classes of these exceptions do not also produce events.
  81. To that end, you may want to supply additional mappings to the publisher through the `setAdditionalExceptionMappings` method:
  82. [tabs]
  83. ======
  84. Java::
  85. +
  86. [source,java,role="primary"]
  87. ----
  88. @Bean
  89. public AuthenticationEventPublisher authenticationEventPublisher
  90. (ApplicationEventPublisher applicationEventPublisher) {
  91. Map<Class<? extends AuthenticationException>,
  92. Class<? extends AbstractAuthenticationFailureEvent>> mapping =
  93. Collections.singletonMap(FooException.class, FooEvent.class);
  94. AuthenticationEventPublisher authenticationEventPublisher =
  95. new DefaultAuthenticationEventPublisher(applicationEventPublisher);
  96. authenticationEventPublisher.setAdditionalExceptionMappings(mapping);
  97. return authenticationEventPublisher;
  98. }
  99. ----
  100. Kotlin::
  101. +
  102. [source,kotlin,role="secondary"]
  103. ----
  104. @Bean
  105. fun authenticationEventPublisher
  106. (applicationEventPublisher: ApplicationEventPublisher?): AuthenticationEventPublisher {
  107. val mapping: Map<Class<out AuthenticationException>, Class<out AbstractAuthenticationFailureEvent>> =
  108. mapOf(Pair(FooException::class.java, FooEvent::class.java))
  109. val authenticationEventPublisher = DefaultAuthenticationEventPublisher(applicationEventPublisher)
  110. authenticationEventPublisher.setAdditionalExceptionMappings(mapping)
  111. return authenticationEventPublisher
  112. }
  113. ----
  114. ======
  115. == Default Event
  116. You can also supply a catch-all event to fire in the case of any `AuthenticationException`:
  117. [tabs]
  118. ======
  119. Java::
  120. +
  121. [source,java,role="primary"]
  122. ----
  123. @Bean
  124. public AuthenticationEventPublisher authenticationEventPublisher
  125. (ApplicationEventPublisher applicationEventPublisher) {
  126. AuthenticationEventPublisher authenticationEventPublisher =
  127. new DefaultAuthenticationEventPublisher(applicationEventPublisher);
  128. authenticationEventPublisher.setDefaultAuthenticationFailureEvent
  129. (GenericAuthenticationFailureEvent.class);
  130. return authenticationEventPublisher;
  131. }
  132. ----
  133. Kotlin::
  134. +
  135. [source,kotlin,role="secondary"]
  136. ----
  137. @Bean
  138. fun authenticationEventPublisher
  139. (applicationEventPublisher: ApplicationEventPublisher?): AuthenticationEventPublisher {
  140. val authenticationEventPublisher = DefaultAuthenticationEventPublisher(applicationEventPublisher)
  141. authenticationEventPublisher.setDefaultAuthenticationFailureEvent(GenericAuthenticationFailureEvent::class.java)
  142. return authenticationEventPublisher
  143. }
  144. ----
  145. ======