From 4691a0021b54dd55cde405a764bb0656c1d7b8ba Mon Sep 17 00:00:00 2001 From: aidar Date: Wed, 17 Feb 2021 19:49:43 +0300 Subject: [PATCH] websocket configs --- demo-client-app/src/App.js | 12 +++--- .../config/WebSocketConfig.java | 39 ++++++++++++++++++- .../web/controller/UserInfoController.java | 2 +- 3 files changed, 45 insertions(+), 8 deletions(-) diff --git a/demo-client-app/src/App.js b/demo-client-app/src/App.js index 31bf123..964ed64 100644 --- a/demo-client-app/src/App.js +++ b/demo-client-app/src/App.js @@ -6,16 +6,16 @@ import "./App.css"; let stomp -const connect = async () => { +const connect = async (token) => { if (stomp != null) return; console.info("Connect to Websocket"); const sock = new SockJS("/api/ws"); stomp = Stomp.over(sock); stomp.connect( - {}, - () => { - console.log("Connected"); + {"X-Authorization": token}, + (frame) => { + console.log("Connected", frame); }, error => { console.error("Disconnected"); @@ -38,8 +38,8 @@ function App({ keycloak }) { }, [keycloak.token]); useEffect(() => { - connect(); - }, []); + connect(keycloak.token); + }, [keycloak.token]); return (
diff --git a/demo-resource-server/src/main/java/ru/digitalbanana/demoresourceserver/config/WebSocketConfig.java b/demo-resource-server/src/main/java/ru/digitalbanana/demoresourceserver/config/WebSocketConfig.java index ce6fa3f..b58abcb 100644 --- a/demo-resource-server/src/main/java/ru/digitalbanana/demoresourceserver/config/WebSocketConfig.java +++ b/demo-resource-server/src/main/java/ru/digitalbanana/demoresourceserver/config/WebSocketConfig.java @@ -1,12 +1,25 @@ package ru.digitalbanana.demoresourceserver.config; +import java.util.List; + +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Configuration; +import org.springframework.messaging.Message; +import org.springframework.messaging.MessageChannel; +import org.springframework.messaging.simp.config.ChannelRegistration; import org.springframework.messaging.simp.config.MessageBrokerRegistry; +import org.springframework.messaging.simp.stomp.StompCommand; +import org.springframework.messaging.simp.stomp.StompHeaderAccessor; +import org.springframework.messaging.support.ChannelInterceptor; +import org.springframework.messaging.support.MessageHeaderAccessor; +import org.springframework.security.core.Authentication; +import org.springframework.security.oauth2.jwt.Jwt; +import org.springframework.security.oauth2.jwt.JwtDecoder; +import org.springframework.security.oauth2.server.resource.authentication.JwtAuthenticationConverter; import org.springframework.web.socket.config.annotation.EnableWebSocketMessageBroker; import org.springframework.web.socket.config.annotation.StompEndpointRegistry; import org.springframework.web.socket.config.annotation.WebSocketMessageBrokerConfigurer; import org.springframework.web.socket.config.annotation.WebSocketTransportRegistration; - /** * Web Socket configuration * Created by dima on 8/12/16. @@ -15,6 +28,30 @@ import org.springframework.web.socket.config.annotation.WebSocketTransportRegist @EnableWebSocketMessageBroker public class WebSocketConfig implements WebSocketMessageBrokerConfigurer { + @Autowired + private JwtDecoder jwtDecoder; + + @Override + public void configureClientInboundChannel(ChannelRegistration registration) { + registration.interceptors(new ChannelInterceptor() { + @Override + public Message preSend(Message message, MessageChannel channel) { + StompHeaderAccessor accessor = + MessageHeaderAccessor.getAccessor(message, StompHeaderAccessor.class); + if (StompCommand.CONNECT.equals(accessor.getCommand())) { + List authorization = accessor.getNativeHeader("X-Authorization"); + + String accessToken = authorization.get(0);//.split(" ")[1]; + Jwt jwt = jwtDecoder.decode(accessToken); + JwtAuthenticationConverter converter = new JwtAuthenticationConverter(); + Authentication authentication = converter.convert(jwt); + accessor.setUser(authentication); + } + return message; + } + }); + } + @Override public void configureMessageBroker(MessageBrokerRegistry registry) { registry.setApplicationDestinationPrefixes("/app"); diff --git a/demo-resource-server/src/main/java/ru/digitalbanana/demoresourceserver/web/controller/UserInfoController.java b/demo-resource-server/src/main/java/ru/digitalbanana/demoresourceserver/web/controller/UserInfoController.java index 15dc9b8..912ecea 100644 --- a/demo-resource-server/src/main/java/ru/digitalbanana/demoresourceserver/web/controller/UserInfoController.java +++ b/demo-resource-server/src/main/java/ru/digitalbanana/demoresourceserver/web/controller/UserInfoController.java @@ -27,7 +27,7 @@ public class UserInfoController { @GetMapping(value = "/userinfo") public String userinfo(@AuthenticationPrincipal Jwt principal) { - return principal.getClaimAsString("email"); + return principal.getClaimAsString("sub"); } @GetMapping(value = "/users")