diff --git a/demo-client-app/src/App.js b/demo-client-app/src/App.js index 948905c..1872819 100644 --- a/demo-client-app/src/App.js +++ b/demo-client-app/src/App.js @@ -4,53 +4,55 @@ import SockJS from "sockjs-client"; import logo from "./logo.svg"; import "./App.css"; -let stomp +let stomp; const connect = async (token) => { if (stomp != null) return; console.info("Connect to Websocket"); - const sock = new SockJS("/api/ws"); + const sock = new SockJS("http://localhost:8081/api/ws"); stomp = Stomp.over(sock); + stomp.debug = (msg) => {} + stomp.connect( - {"X-Authorization": token}, + { "X-Authorization": token }, (frame) => { console.log("Connected", frame); const requestUrl = "/app/simple"; let params = { tratata: 1, - gratata: 0 - } - stomp.send( - requestUrl, - JSON.stringify(params) - ); - stomp.subscribe("/user/simple", (results, errors)=>{ - console.log("results: ", results); - console.log("errors: ", errors); + gratata: 0, + }; + + stomp.subscribe("/user/simple", (results) => { + console.log(`msg from server: ${results.body}`); }); + stomp.send(requestUrl, JSON.stringify(params)); }, - error => { + (error) => { console.error("Disconnected: ", error); - } + }, ); -} +}; function App({ keycloak }) { - const fetchFromApi = useCallback(async (url) => { - const response = await fetch(url, { - headers: { - Authorization: `Bearer ${keycloak.token}`, - }, - }); - if (response.ok) { - alert(await response.text()); - } else { - console.error(response.statusText); - } - }, [keycloak.token]); + const fetchFromApi = useCallback( + async (url) => { + const response = await fetch(url, { + headers: { + Authorization: `Bearer ${keycloak.token}`, + }, + }); + if (response.ok) { + alert(await response.text()); + } else { + console.error(response.statusText); + } + }, + [keycloak.token], + ); useEffect(() => { connect(keycloak.token); @@ -67,7 +69,7 @@ function App({ keycloak }) { className="App-link" onClick={(e) => { e.preventDefault(); - fetchFromApi("/api/userinfo"); + fetchFromApi("http://localhost:8081/api/userinfo"); }} > Get user email @@ -77,7 +79,7 @@ function App({ keycloak }) { className="App-link" onClick={(e) => { e.preventDefault(); - fetchFromApi("/api/users"); + fetchFromApi("http://localhost:8081/api/users"); }} > Get all users diff --git a/demo-resource-server/build.gradle b/demo-resource-server/build.gradle index e128b90..4cf5197 100644 --- a/demo-resource-server/build.gradle +++ b/demo-resource-server/build.gradle @@ -23,6 +23,7 @@ dependencies { implementation 'org.springframework.boot:spring-boot-starter-oauth2-resource-server' implementation 'org.springframework.boot:spring-boot-starter-web' implementation 'org.springframework.boot:spring-boot-starter-websocket' + implementation 'org.springframework.security:spring-security-messaging' runtimeOnly 'org.postgresql:postgresql' developmentOnly 'org.springframework.boot:spring-boot-devtools' testImplementation 'org.springframework.boot:spring-boot-starter-test' 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 b58abcb..e979322 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 @@ -41,7 +41,7 @@ public class WebSocketConfig implements WebSocketMessageBrokerConfigurer { if (StompCommand.CONNECT.equals(accessor.getCommand())) { List authorization = accessor.getNativeHeader("X-Authorization"); - String accessToken = authorization.get(0);//.split(" ")[1]; + String accessToken = authorization.get(0); Jwt jwt = jwtDecoder.decode(accessToken); JwtAuthenticationConverter converter = new JwtAuthenticationConverter(); Authentication authentication = converter.convert(jwt); @@ -54,6 +54,7 @@ public class WebSocketConfig implements WebSocketMessageBrokerConfigurer { @Override public void configureMessageBroker(MessageBrokerRegistry registry) { + registry.enableSimpleBroker("/simple"); registry.setApplicationDestinationPrefixes("/app"); } diff --git a/demo-resource-server/src/main/java/ru/digitalbanana/demoresourceserver/websocket/controller/SimpleController.java b/demo-resource-server/src/main/java/ru/digitalbanana/demoresourceserver/websocket/controller/SimpleController.java new file mode 100644 index 0000000..a6982d3 --- /dev/null +++ b/demo-resource-server/src/main/java/ru/digitalbanana/demoresourceserver/websocket/controller/SimpleController.java @@ -0,0 +1,32 @@ +package ru.digitalbanana.demoresourceserver.websocket.controller; + +import java.security.Principal; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.messaging.handler.annotation.MessageMapping; +import org.springframework.messaging.simp.SimpMessageSendingOperations; +import org.springframework.security.core.annotation.AuthenticationPrincipal; +import org.springframework.stereotype.Controller; + +import lombok.extern.slf4j.Slf4j; + +@Controller +@Slf4j +public class SimpleController { + + @Autowired + private SimpMessageSendingOperations messaging; + + + @MessageMapping("/simple") + public void simple(@AuthenticationPrincipal Principal principal) { + String userId = principal.getName(); + log.info("Received simple message from {}", userId); + + messaging.convertAndSendToUser( + userId, + "/simple", + "Hello, my friend!!!!!" + ); + } +} diff --git a/demo-resource-server/src/main/resources/application.yml b/demo-resource-server/src/main/resources/application.yml index dc9c400..034af2e 100644 --- a/demo-resource-server/src/main/resources/application.yml +++ b/demo-resource-server/src/main/resources/application.yml @@ -4,6 +4,7 @@ server: context-path: /api forward-headers-strategy: framework # nginx reverse proxy logging.level: + '[ru.digitalbanana.demoresourceserver]': info '[org.springframework.web]': debug ####### resource server configuration properties spring: