Skip to content

Commit fe8e68e

Browse files
committed
Add XML Testing Support
1 parent e5ee9c5 commit fe8e68e

File tree

3 files changed

+43
-2
lines changed

3 files changed

+43
-2
lines changed

config/src/main/java/org/springframework/security/config/websocket/WebSocketMessageBrokerSecurityBeanDefinitionParser.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -305,7 +305,7 @@ static class MessageSecurityPostProcessor implements BeanDefinitionRegistryPostP
305305

306306
private static final String CUSTOM_ARG_RESOLVERS_PROP = "customArgumentResolvers";
307307

308-
private static final String TEMPLATE_EXPRESSION_BEAN_ID = "templateDefaults";
308+
private static final String TEMPLATE_EXPRESSION_BEAN_ID = "annotationExpressionTemplateDefaults";
309309

310310
private final String inboundSecurityInterceptorId;
311311

@@ -333,7 +333,7 @@ public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) t
333333
AuthenticationPrincipalArgumentResolver.class);
334334
if (registry.containsBeanDefinition(TEMPLATE_EXPRESSION_BEAN_ID)) {
335335
beanDefinition.getPropertyValues()
336-
.add(TEMPLATE_EXPRESSION_BEAN_ID, new RuntimeBeanReference(TEMPLATE_EXPRESSION_BEAN_ID));
336+
.add("templateDefaults", new RuntimeBeanReference(TEMPLATE_EXPRESSION_BEAN_ID));
337337
}
338338
argResolvers.add(beanDefinition);
339339
bd.getPropertyValues().add(CUSTOM_ARG_RESOLVERS_PROP, argResolvers);

config/src/test/java/org/springframework/security/config/websocket/WebSocketMessageBrokerConfigTests.java

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,10 @@
1616

1717
package org.springframework.security.config.websocket;
1818

19+
import java.lang.annotation.ElementType;
20+
import java.lang.annotation.Retention;
21+
import java.lang.annotation.RetentionPolicy;
22+
import java.lang.annotation.Target;
1923
import java.util.HashMap;
2024
import java.util.Map;
2125
import java.util.function.Supplier;
@@ -47,6 +51,7 @@
4751
import org.springframework.messaging.support.GenericMessage;
4852
import org.springframework.security.access.AccessDeniedException;
4953
import org.springframework.security.access.expression.SecurityExpressionOperations;
54+
import org.springframework.security.authentication.TestingAuthenticationToken;
5055
import org.springframework.security.authorization.AuthorizationDecision;
5156
import org.springframework.security.authorization.AuthorizationManager;
5257
import org.springframework.security.config.test.SpringTestContext;
@@ -55,6 +60,7 @@
5560
import org.springframework.security.core.annotation.AuthenticationPrincipal;
5661
import org.springframework.security.core.context.SecurityContextHolder;
5762
import org.springframework.security.core.context.SecurityContextHolderStrategy;
63+
import org.springframework.security.core.context.SecurityContextImpl;
5864
import org.springframework.security.messaging.access.expression.DefaultMessageSecurityExpressionHandler;
5965
import org.springframework.security.messaging.access.expression.MessageSecurityExpressionRoot;
6066
import org.springframework.security.test.context.annotation.SecurityTestExecutionListeners;
@@ -376,6 +382,24 @@ public void sendWhenNoIdMessageThenAuthenticationPrincipalResolved() {
376382
assertThat(this.messageController.username).isEqualTo("anonymous");
377383
}
378384

385+
@Test
386+
public void sendMessageWhenMetaAnnotationThenAuthenticationPrincipalResolved() {
387+
this.spring.configLocations(xml("SyncConfig")).autowire();
388+
Authentication harold = new TestingAuthenticationToken("harold", "password", "ROLE_USER");
389+
try {
390+
getSecurityContextHolderStrategy().setContext(new SecurityContextImpl(harold));
391+
this.clientInboundChannel.send(message("/hi"));
392+
assertThat(this.spring.getContext().getBean(MessageController.class).message).isEqualTo("Hi, Harold!");
393+
Authentication user = new TestingAuthenticationToken("user", "password", "ROLE_USER");
394+
getSecurityContextHolderStrategy().setContext(new SecurityContextImpl(user));
395+
this.clientInboundChannel.send(message("/hi"));
396+
assertThat(this.spring.getContext().getBean(MessageController.class).message).isEqualTo("Hi, Stranger!");
397+
}
398+
finally {
399+
getSecurityContextHolderStrategy().clearContext();
400+
}
401+
}
402+
379403
@Test
380404
public void requestWhenConnectMessageThenUsesCsrfTokenHandshakeInterceptor() throws Exception {
381405
this.spring.configLocations(xml("SyncConfig")).autowire();
@@ -553,16 +577,32 @@ public boolean isGenerated() {
553577

554578
}
555579

580+
@Retention(RetentionPolicy.RUNTIME)
581+
@Target(ElementType.PARAMETER)
582+
@AuthenticationPrincipal(expression = "#this.equals('{value}')")
583+
@interface IsUser {
584+
585+
String value() default "user";
586+
587+
}
588+
556589
@Controller
557590
static class MessageController {
558591

559592
String username;
560593

594+
String message;
595+
561596
@MessageMapping("/message")
562597
void authentication(@AuthenticationPrincipal String username) {
563598
this.username = username;
564599
}
565600

601+
@MessageMapping("/hi")
602+
void sayHello(@IsUser("harold") boolean isHarold) {
603+
this.message = isHarold ? "Hi, Harold!" : "Hi, Stranger!";
604+
}
605+
566606
}
567607

568608
@Controller

config/src/test/resources/org/springframework/security/config/websocket/WebSocketMessageBrokerConfigTests-SyncConfig.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,4 +28,5 @@
2828
<intercept-message pattern="/**" access="permitAll"/>
2929
</websocket-message-broker>
3030

31+
<b:bean name="annotationExpressionTemplateDefaults" class="org.springframework.security.core.annotation.AnnotationTemplateExpressionDefaults"/>
3132
</b:beans>

0 commit comments

Comments
 (0)