このバージョンはまだ開発中であり、まだ安定しているとは見なされていません。最新の安定バージョンについては、Spring Security 6.5.6 を使用してください!

認可イベント

認可が拒否されるたびに、AuthorizationDeniedEvent が起動されます。また、付与された認可に対して AuthorizationGrantedEvent を起動することもできます。

これらのイベントをリッスンするには、最初に AuthorizationEventPublisher を公開する必要があります。

Spring Security の SpringAuthorizationEventPublisher はおそらくうまくいくでしょう。Spring の ApplicationEventPublisher を使用して認可イベントを公開します。

  • Java

  • Kotlin

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

次に、Spring の @EventListener サポートを使用できます。

  • Java

  • Kotlin

@Component
public class AuthenticationEvents {

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

    @EventListener
    fun onFailure(failure: AuthorizationDeniedEvent?) {
        // ...
    }
}

認可されたイベント

AuthorizationGrantedEvent は非常にノイズが多い可能性があるため、デフォルトでは公開されていません。

実際、これらのイベントを公開するには、アプリケーションにノイズの多い認可イベントが殺到しないようにするために、ビジネスロジックが必要になる可能性があります。

成功イベントをフィルタリングする独自の述語を指定できます。例: 次の発行者は、ROLE_ADMIN が必要な認可付与のみを発行します。

  • Java

  • Kotlin

@Bean
AuthorizationEventPublisher authorizationEventPublisher() {
    SpringAuthorizationEventPublisher eventPublisher = new SpringAuthorizationEventPublisher();
    eventPublisher.setShouldPublishEvent((result) -> {
        if (!result.isGranted()) {
            return true;
        }
        if (result instanceof AuthorityAuthorizationDecision decision) {
            Collection<GrantedAuthority> authorities = decision.getAuthorities();
            return AuthorityUtils.authorityListToSet(authorities).contains("ROLE_ADMIN");
        }
        return false;
    });
    return eventPublisher;
}
@Bean
fun authorizationEventPublisher(): AuthorizationEventPublisher {
    val eventPublisher = SpringAuthorizationEventPublisher()
    eventPublisher.setShouldPublishEvent { (result) ->
        if (!result.isGranted()) {
            return true
        }
        if (decision is AuthorityAuthorizationDecision) {
            val authorities = decision.getAuthorities()
            return AuthorityUtils.authorityListToSet(authorities).contains("ROLE_ADMIN")
        }
        return false
    }
    return eventPublisher
}