diff --git a/spring-messaging/src/main/java/org/springframework/messaging/simp/user/MultiServerUserRegistry.java b/spring-messaging/src/main/java/org/springframework/messaging/simp/user/MultiServerUserRegistry.java index b77893879e4..5bc331d666a 100644 --- a/spring-messaging/src/main/java/org/springframework/messaging/simp/user/MultiServerUserRegistry.java +++ b/spring-messaging/src/main/java/org/springframework/messaging/simp/user/MultiServerUserRegistry.java @@ -18,6 +18,7 @@ package org.springframework.messaging.simp.user; import java.net.InetAddress; import java.net.UnknownHostException; +import java.security.Principal; import java.util.Collections; import java.util.HashMap; import java.util.HashSet; @@ -310,6 +311,12 @@ public class MultiServerUserRegistry implements SimpUserRegistry, SmartApplicati return this.name; } + @Nullable + @Override + public Principal getPrincipal() { + return null; + } + @Override public boolean hasSessions() { if (this.sessionLookup != null) { diff --git a/spring-messaging/src/main/java/org/springframework/messaging/simp/user/SimpUser.java b/spring-messaging/src/main/java/org/springframework/messaging/simp/user/SimpUser.java index 544bba0f1aa..bcd0d673927 100644 --- a/spring-messaging/src/main/java/org/springframework/messaging/simp/user/SimpUser.java +++ b/spring-messaging/src/main/java/org/springframework/messaging/simp/user/SimpUser.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2017 the original author or authors. + * Copyright 2002-2020 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,6 +16,7 @@ package org.springframework.messaging.simp.user; +import java.security.Principal; import java.util.Set; import org.springframework.lang.Nullable; @@ -33,6 +34,15 @@ public interface SimpUser { */ String getName(); + /** + * Return the user associated with the session, if available. Typically, the + * user information is available unless the user is connected to a different + * server in a multi-server user registry scenario. + * @since 5.3 + */ + @Nullable + Principal getPrincipal(); + /** * Whether the user has any sessions. */ diff --git a/spring-messaging/src/test/java/org/springframework/messaging/simp/user/TestSimpUser.java b/spring-messaging/src/test/java/org/springframework/messaging/simp/user/TestSimpUser.java index dec42d8d2fe..11a46884ead 100644 --- a/spring-messaging/src/test/java/org/springframework/messaging/simp/user/TestSimpUser.java +++ b/spring-messaging/src/test/java/org/springframework/messaging/simp/user/TestSimpUser.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2017 the original author or authors. + * Copyright 2002-2020 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,11 +16,14 @@ package org.springframework.messaging.simp.user; +import java.security.Principal; import java.util.HashMap; import java.util.HashSet; import java.util.Map; import java.util.Set; +import org.springframework.lang.Nullable; + /** * @author Rossen Stoyanchev */ @@ -41,6 +44,12 @@ public class TestSimpUser implements SimpUser { return name; } + @Nullable + @Override + public Principal getPrincipal() { + return null; + } + @Override public Set getSessions() { return new HashSet<>(this.sessions.values()); diff --git a/spring-websocket/src/main/java/org/springframework/web/socket/messaging/DefaultSimpUserRegistry.java b/spring-websocket/src/main/java/org/springframework/web/socket/messaging/DefaultSimpUserRegistry.java index ffc07460f98..e1c07de017b 100644 --- a/spring-websocket/src/main/java/org/springframework/web/socket/messaging/DefaultSimpUserRegistry.java +++ b/spring-websocket/src/main/java/org/springframework/web/socket/messaging/DefaultSimpUserRegistry.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2018 the original author or authors. + * Copyright 2002-2020 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -114,7 +114,7 @@ public class DefaultSimpUserRegistry implements SimpUserRegistry, SmartApplicati synchronized (this.sessionLock) { LocalSimpUser simpUser = this.users.get(name); if (simpUser == null) { - simpUser = new LocalSimpUser(name); + simpUser = new LocalSimpUser(name, user); this.users.put(name, simpUser); } LocalSimpSession session = new LocalSimpSession(sessionId, simpUser); @@ -193,11 +193,14 @@ public class DefaultSimpUserRegistry implements SimpUserRegistry, SmartApplicati private final String name; + private final Principal user; + private final Map userSessions = new ConcurrentHashMap<>(1); - public LocalSimpUser(String userName) { + public LocalSimpUser(String userName, Principal user) { Assert.notNull(userName, "User name must not be null"); this.name = userName; + this.user = user; } @Override @@ -205,6 +208,12 @@ public class DefaultSimpUserRegistry implements SimpUserRegistry, SmartApplicati return this.name; } + @Nullable + @Override + public Principal getPrincipal() { + return this.user; + } + @Override public boolean hasSessions() { return !this.userSessions.isEmpty();