javascript - Spring RSocket Security + RSocket-WebSocket-Client(浏览器)

标签 javascript java spring-security rsocket

我正在尝试在 Vue 中创建一个站点并在 Spring 上创建后端。我想使用 rsocket 来传输数据,但是只要我在 spring 中添加 rsocket seurity,我就会得到:

'metadata is malformed'

想看看使用 jwt/simpleauth 的工作示例

最佳答案

我用 Simple Auth 解决了这个问题,现在我想将这个授权与 spring websecurity 同步。 那些。以便 rsocket 中的路由通过网络安全检查授权。我知道这可以通过 jwt token 实现,即通过 rest 向客户端发送 jwt token ,但我如何在代码中执行此操作? JS 客户端(浏览器)和 Spring,如何生成 userdetails token ? 为了以防万一,我将留下一个简单验证实现的示例:

// METADATA BUILDER
    import {encodeRoute, encodeBearerAuthMetadata, encodeSimpleAuthMetadata, encodeAndAddCustomMetadata, encodeAndAddWellKnownMetadata, MESSAGE_RSOCKET_ROUTING, MESSAGE_RSOCKET_AUTHENTICATION} from "rsocket-core";
    
    export default class Metadata {
        constructor(json) {
            this.route = json['route'];
            this.auth = json['auth'];
        }
    
        toMetadata() {
            let metadata = Buffer.alloc(0);
            if (this.auth) {
                if (this.auth["type"] === 'bearer') {
                    metadata = encodeAndAddCustomMetadata(
                        metadata,
                        MESSAGE_RSOCKET_AUTHENTICATION.string,
                        encodeBearerAuthMetadata(this.auth["token"]),
                    );
                }
                if (this.auth["type"] === 'simple') {
                    metadata = encodeAndAddCustomMetadata(
                        metadata,
                        MESSAGE_RSOCKET_AUTHENTICATION.string,
                        encodeSimpleAuthMetadata(this.auth["username"], this.auth["password"]),
                    );
                }
            }
            if (this.route) {
                metadata = encodeAndAddWellKnownMetadata(
                    metadata,
                    MESSAGE_RSOCKET_ROUTING,
                    encodeRoute(this.route)
                );
            }
            return metadata;
        }
    }

// RSOCKET CLIENT CLASS
    import RSocketWebSocketClient from "rsocket-websocket-client";
    import {BufferEncoders, MESSAGE_RSOCKET_COMPOSITE_METADATA, RSocketClient,toBuffer} from "rsocket-core";
    import Metadata from "./metadata";
    
    
    export default class SpringClient {
        constructor(wsUrl, keepAlive = 60000, lifetime = 180000, dataMimeType = "application/json") {
            this.client = new RSocketClient({
                "setup": {
                    "keepAlive": keepAlive,
                    "lifetime": lifetime,
                    "dataMimeType": dataMimeType,
                    "metadataMimeType": MESSAGE_RSOCKET_COMPOSITE_METADATA.string
                },
                "transport": new RSocketWebSocketClient({
                    "url": wsUrl
                }, BufferEncoders)
            });
        }
    
        bearerAuth(token) {
            this.auth = {type: "bearer", token: token}
        }
    
        simpleAuth(username, password) {
            this.auth = {type: "simple", username: username, password: password}
        }
    
        logout() {
            this.auth = null;
        }
    
        connect(
            completeCallback = (socket) => {
            }, errorCallback = (error) => {
            }, subscribeCallback = (cancel) => {
            }
        ) {
            this.client.connect().subscribe({
                onComplete: socket => {
                    this.socket = socket;
                    completeCallback(socket);
                },
                onError: error => {
                    errorCallback(error);
                },
                onSubscribe: cancel => {
                    subscribeCallback(cancel);
                }
            });
        }
    
        requestResponse(data, route,
                        completeCallback = (data) => {
                        },
                        errorCallback = (error) => {
                        },
                        subscribeCallback = (cancel) => {
                        }
        ) {
            if (this.socket) {
                const metadata = new Metadata({
                    route: route,
                    auth: this.auth
                }).toMetadata();
                data = toBuffer(data);
                this.socket.requestResponse({
                    data,
                    metadata
                }).subscribe({
                    onComplete: data => {
                        completeCallback(data);
                    },
                    onError: error => {
                        errorCallback(error);
                    },
                    onSubscribe: cancel => {
                        subscribeCallback(cancel);
                    }
                });
            }
        }
    }
// EXAMPLE, HOW TO USE

    import SpringClient from "./springclient";
    
    this.client = new SpringClient("ws://localhost:7000/", 5000, 15000, "text/plain");
    this.client.connect(
        (socket) => {
            console.log("got connection complete");
            this.socket = socket;
        },
        (error) => {
            console.log("got connection error");
            console.error(error);
        },
        (cancel) => {
            console.log("got connection subscribe");
            /* call cancel() to abort */
        }
    )
    this.client.simpleAuth("LOGIN", "PASSWORD");
    this.client.requestResponse("MESSAGE", "ROUTE",
        (data) => {
            console.log("got response with requestResponse");
            console.log(data.data);
        },
        (error) => {
    
            console.log("got error with requestResponse");
            console.error(error);
        },
        (cancel) => {
            console.log(message);
            /* call cancel() to stop onComplete/onError */
        }
    );

关于javascript - Spring RSocket Security + RSocket-WebSocket-Client(浏览器),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66879773/

相关文章:

javascript - 正则表达式交换注释的 HTML 进出

java - 来自 Java 的 Xerces-C XSModel 端口

java - 登录系统并有权 Access

java - 如何减少在 Spring 中攻击内存中密码的表面积?

java - 扩展 SimpleUrlAuthenticationFailureHandler 会产生 404 和 No mapping found 警告

javascript - react FlatList renderItem

javascript - 如何将唯一 id 分配给与其行号对应的复选框(更新 : or item ID) under Bootstrap 4?

javascript - react native : running JS code from Java Module in background with AlarmManager

java - glassfish 如何使用 ManagedObjectManagers?

java - 自定义登录页面 Spring Security 的 403 错误