Skip to content

Commit 6dce25d

Browse files
Test with Publisher return type event listener
1 parent ada9549 commit 6dce25d

File tree

1 file changed

+91
-58
lines changed

1 file changed

+91
-58
lines changed

config/src/test/java/org/springframework/security/config/annotation/method/configuration/ReactiveAuthorizationManagerMethodSecurityConfigurationTests.java

+91-58
Original file line numberDiff line numberDiff line change
@@ -19,17 +19,19 @@
1919
import java.util.concurrent.ArrayBlockingQueue;
2020
import java.util.concurrent.BlockingQueue;
2121
import java.util.concurrent.TimeUnit;
22+
import java.util.function.Consumer;
2223

2324
import org.junit.jupiter.api.Test;
2425
import org.junit.jupiter.api.extension.ExtendWith;
2526
import reactor.core.publisher.Mono;
2627
import reactor.test.StepVerifier;
2728

2829
import org.springframework.beans.factory.annotation.Autowired;
29-
import org.springframework.context.ApplicationEventPublisher;
30-
import org.springframework.context.ApplicationListener;
30+
import org.springframework.context.ApplicationContext;
3131
import org.springframework.context.annotation.Bean;
3232
import org.springframework.context.annotation.Configuration;
33+
import org.springframework.context.annotation.Import;
34+
import org.springframework.context.event.EventListener;
3335
import org.springframework.security.access.AccessDeniedException;
3436
import org.springframework.security.authentication.AuthenticationTrustResolverImpl;
3537
import org.springframework.security.authorization.AuthorizationDecision;
@@ -44,6 +46,7 @@
4446
import org.springframework.security.test.context.support.ReactorContextTestExecutionListener;
4547
import org.springframework.security.test.context.support.WithMockUser;
4648
import org.springframework.security.test.context.support.WithSecurityContextTestExecutionListener;
49+
import org.springframework.stereotype.Component;
4750
import org.springframework.test.context.TestExecutionListeners;
4851
import org.springframework.test.context.junit.jupiter.SpringExtension;
4952

@@ -62,9 +65,6 @@ public class ReactiveAuthorizationManagerMethodSecurityConfigurationTests {
6265
@Autowired
6366
ReactiveAuthorizationEventPublisher eventPublisher;
6467

65-
@Autowired
66-
MyEventListener eventListener;
67-
6868
AuthenticationTrustResolverImpl trustResolver = new AuthenticationTrustResolverImpl();
6969

7070
@Test
@@ -73,24 +73,26 @@ void preAuthorizeMonoWhenDeniedThenPublishEvent() {
7373
StepVerifier.create(this.messageService.monoPreAuthorizeHasRoleFindById(1))
7474
.expectError(AccessDeniedException.class)
7575
.verify();
76-
ReactiveAuthorizationDeniedEvent<?> event = this.eventListener.getEvent();
77-
assertThat(event).isNotNull();
78-
assertThat(event.getAuthorizationDecision().isGranted()).isFalse();
79-
StepVerifier.create(event.getAuthentication()).assertNext(this.trustResolver::isAnonymous).verifyComplete();
76+
assertEvents((event) -> {
77+
assertThat(event).isNotNull();
78+
assertThat(event.getAuthorizationDecision().isGranted()).isFalse();
79+
StepVerifier.create(event.getAuthentication()).assertNext(this.trustResolver::isAnonymous).verifyComplete();
80+
});
8081
}
8182

8283
@Test
8384
@WithMockUser(roles = "ADMIN")
8485
void preAuthorizeMonoWhenGrantedThenPublishEvent() {
8586
this.spring.register(Config.class, AuthorizationEventPublisherConfig.class).autowire();
8687
StepVerifier.create(this.messageService.monoPreAuthorizeHasRoleFindById(1)).verifyComplete();
87-
ReactiveAuthorizationGrantedEvent<?> event = this.eventListener.getEvent();
88-
assertThat(event).isNotNull();
89-
assertThat(event.getAuthorizationDecision().isGranted()).isTrue();
90-
StepVerifier.create(event.getAuthentication())
91-
.assertNext((auth) -> assertThat(auth.getAuthorities()).extracting(GrantedAuthority::getAuthority)
92-
.contains("ROLE_ADMIN"))
93-
.verifyComplete();
88+
assertEvents((event) -> {
89+
assertThat(event).isNotNull();
90+
assertThat(event.getAuthorizationDecision().isGranted()).isTrue();
91+
StepVerifier.create(event.getAuthentication())
92+
.assertNext((auth) -> assertThat(auth.getAuthorities()).extracting(GrantedAuthority::getAuthority)
93+
.contains("ROLE_ADMIN"))
94+
.verifyComplete();
95+
});
9496
}
9597

9698
@Test
@@ -99,24 +101,26 @@ void preAuthorizeFluxWhenDeniedThenPublishEvent() {
99101
StepVerifier.create(this.messageService.fluxPreAuthorizeHasRoleFindById(1))
100102
.expectError(AccessDeniedException.class)
101103
.verify();
102-
ReactiveAuthorizationDeniedEvent<?> event = this.eventListener.getEvent();
103-
assertThat(event).isNotNull();
104-
assertThat(event.getAuthorizationDecision().isGranted()).isFalse();
105-
StepVerifier.create(event.getAuthentication()).assertNext(this.trustResolver::isAnonymous).verifyComplete();
104+
assertEvents((event) -> {
105+
assertThat(event).isNotNull();
106+
assertThat(event.getAuthorizationDecision().isGranted()).isFalse();
107+
StepVerifier.create(event.getAuthentication()).assertNext(this.trustResolver::isAnonymous).verifyComplete();
108+
});
106109
}
107110

108111
@Test
109112
@WithMockUser(roles = "ADMIN")
110113
void preAuthorizeFluxWhenGrantedThenPublishEvent() {
111114
this.spring.register(Config.class, AuthorizationEventPublisherConfig.class).autowire();
112115
StepVerifier.create(this.messageService.fluxPreAuthorizeHasRoleFindById(1)).verifyComplete();
113-
ReactiveAuthorizationGrantedEvent<?> event = this.eventListener.getEvent();
114-
assertThat(event).isNotNull();
115-
assertThat(event.getAuthorizationDecision().isGranted()).isTrue();
116-
StepVerifier.create(event.getAuthentication())
117-
.assertNext((auth) -> assertThat(auth.getAuthorities()).extracting(GrantedAuthority::getAuthority)
118-
.contains("ROLE_ADMIN"))
119-
.verifyComplete();
116+
assertEvents((event) -> {
117+
assertThat(event).isNotNull();
118+
assertThat(event.getAuthorizationDecision().isGranted()).isTrue();
119+
StepVerifier.create(event.getAuthentication())
120+
.assertNext((auth) -> assertThat(auth.getAuthorities()).extracting(GrantedAuthority::getAuthority)
121+
.contains("ROLE_ADMIN"))
122+
.verifyComplete();
123+
});
120124
}
121125

122126
@Test
@@ -125,24 +129,26 @@ void postAuthorizeMonoWhenDeniedThenPublishEvent() {
125129
StepVerifier.create(this.messageService.monoPostAuthorizeFindById(1))
126130
.expectError(AccessDeniedException.class)
127131
.verify();
128-
ReactiveAuthorizationDeniedEvent<?> event = this.eventListener.getEvent();
129-
assertThat(event).isNotNull();
130-
assertThat(event.getAuthorizationDecision().isGranted()).isFalse();
131-
StepVerifier.create(event.getAuthentication()).assertNext(this.trustResolver::isAnonymous).verifyComplete();
132+
assertEvents((event) -> {
133+
assertThat(event).isNotNull();
134+
assertThat(event.getAuthorizationDecision().isGranted()).isFalse();
135+
StepVerifier.create(event.getAuthentication()).assertNext(this.trustResolver::isAnonymous).verifyComplete();
136+
});
132137
}
133138

134139
@Test
135140
@WithMockUser(roles = "ADMIN")
136141
void postAuthorizeMonoWhenGrantedThenPublishEvent() {
137142
this.spring.register(Config.class, AuthorizationEventPublisherConfig.class).autowire();
138143
StepVerifier.create(this.messageService.monoPostAuthorizeFindById(1)).expectNext("user").verifyComplete();
139-
ReactiveAuthorizationGrantedEvent<?> event = this.eventListener.getEvent();
140-
assertThat(event).isNotNull();
141-
assertThat(event.getAuthorizationDecision().isGranted()).isTrue();
142-
StepVerifier.create(event.getAuthentication())
143-
.assertNext((auth) -> assertThat(auth.getAuthorities()).extracting(GrantedAuthority::getAuthority)
144-
.contains("ROLE_ADMIN"))
145-
.verifyComplete();
144+
assertEvents((event) -> {
145+
assertThat(event).isNotNull();
146+
assertThat(event.getAuthorizationDecision().isGranted()).isTrue();
147+
StepVerifier.create(event.getAuthentication())
148+
.assertNext((auth) -> assertThat(auth.getAuthorities()).extracting(GrantedAuthority::getAuthority)
149+
.contains("ROLE_ADMIN"))
150+
.verifyComplete();
151+
});
146152
}
147153

148154
@Test
@@ -152,21 +158,30 @@ void postAuthorizeFluxWhenDeniedThenPublishEvent() {
152158
StepVerifier.create(this.messageService.fluxPostAuthorizeFindById(1))
153159
.expectError(AccessDeniedException.class)
154160
.verify();
155-
ReactiveAuthorizationDeniedEvent<?> event = this.eventListener.getEvent();
156-
assertThat(event).isNotNull();
157-
assertThat(event.getAuthorizationDecision().isGranted()).isFalse();
158-
StepVerifier.create(event.getAuthentication()).assertNext(this.trustResolver::isAnonymous).verifyComplete();
161+
assertEvents((event) -> {
162+
assertThat(event).isNotNull();
163+
assertThat(event.getAuthorizationDecision().isGranted()).isFalse();
164+
StepVerifier.create(event.getAuthentication()).assertNext(this.trustResolver::isAnonymous).verifyComplete();
165+
});
159166
}
160167

161168
@Test
162169
@WithMockUser
163170
void postAuthorizeFluxWhenGrantedThenPublishEvent() {
164171
this.spring.register(Config.class, AuthorizationEventPublisherConfig.class).autowire();
165172
StepVerifier.create(this.messageService.fluxPostAuthorizeFindById(1)).expectNext("user").verifyComplete();
166-
ReactiveAuthorizationGrantedEvent<?> event = this.eventListener.getEvent();
167-
assertThat(event).isNotNull();
168-
assertThat(event.getAuthorizationDecision().isGranted()).isTrue();
169-
StepVerifier.create(event.getAuthentication()).expectNextCount(1).verifyComplete();
173+
assertEvents((event) -> {
174+
assertThat(event).isNotNull();
175+
assertThat(event.getAuthorizationDecision().isGranted()).isTrue();
176+
StepVerifier.create(event.getAuthentication()).expectNextCount(1).verifyComplete();
177+
});
178+
}
179+
180+
private void assertEvents(Consumer<ReactiveAuthorizationEvent> assertConsumer) {
181+
ReactiveAuthorizationEvent event = ImperativeListener.getEvent();
182+
ReactiveAuthorizationEvent reactiveEvent = ReactiveListener.getEvent();
183+
assertConsumer.accept(event);
184+
assertConsumer.accept(reactiveEvent);
170185
}
171186

172187
@Configuration
@@ -185,11 +200,12 @@ Authz authz() {
185200

186201
}
187202

188-
@Configuration
203+
@Configuration(proxyBeanMethods = false)
204+
@Import({ ImperativeListener.class, ReactiveListener.class })
189205
static class AuthorizationEventPublisherConfig {
190206

191207
@Bean
192-
ReactiveAuthorizationEventPublisher authorizationEventPublisher(ApplicationEventPublisher eventPublisher) {
208+
ReactiveAuthorizationEventPublisher authorizationEventPublisher(ApplicationContext eventPublisher) {
193209
return new ReactiveAuthorizationEventPublisher() {
194210
@Override
195211
public <T> void publishAuthorizationEvent(Mono<Authentication> authentication, T object,
@@ -206,18 +222,19 @@ public <T> void publishAuthorizationEvent(Mono<Authentication> authentication, T
206222
};
207223
}
208224

209-
@Bean
210-
MyEventListener myEventListener() {
211-
return new MyEventListener();
212-
}
213-
214225
}
215226

216-
public static class MyEventListener implements ApplicationListener<ReactiveAuthorizationEvent> {
227+
@Component
228+
public static class ImperativeListener {
217229

218230
static BlockingQueue<ReactiveAuthorizationEvent> events = new ArrayBlockingQueue<>(10);
219231

220-
public <T extends ReactiveAuthorizationEvent> T getEvent() {
232+
@EventListener
233+
public void onEvent(ReactiveAuthorizationEvent event) {
234+
events.add(event);
235+
}
236+
237+
public static <T extends ReactiveAuthorizationEvent> T getEvent() {
221238
try {
222239
return (T) events.poll(1, TimeUnit.SECONDS);
223240
}
@@ -226,9 +243,25 @@ public <T extends ReactiveAuthorizationEvent> T getEvent() {
226243
}
227244
}
228245

229-
@Override
230-
public void onApplicationEvent(ReactiveAuthorizationEvent event) {
231-
events.add(event);
246+
}
247+
248+
@Component
249+
public static class ReactiveListener {
250+
251+
static BlockingQueue<ReactiveAuthorizationEvent> events = new ArrayBlockingQueue<>(10);
252+
253+
@EventListener
254+
public Mono<Void> onEvent(ReactiveAuthorizationEvent event) {
255+
return event.getAuthentication().doOnNext((authentication) -> events.add(event)).then();
256+
}
257+
258+
public static <T extends ReactiveAuthorizationEvent> T getEvent() {
259+
try {
260+
return (T) events.poll(1, TimeUnit.SECONDS);
261+
}
262+
catch (InterruptedException ex) {
263+
return null;
264+
}
232265
}
233266

234267
}

0 commit comments

Comments
 (0)