限制对RPC端点

时间:2016-03-22 11:32:11

标签: deepstream.io

我想知道deepstream是否提供了现成的解决方案来使端点成为私有/公共端点。如果我不知道如何在服务器端跟踪正确的深度呼叫以仅允许某些端点?我相信我需要提供实现canPerformAction的permissionHandler,并检查它是否需要RPC调用授权以及调用者是否正确授权这样做。这是对的吗?我正在查看文档,并了解我对主题P感兴趣,但我不知道什么是正确的检查操作。 https://deepstream.io/docs/constants.html

提前致谢!

1 个答案:

答案 0 :(得分:1)

你的方法很明显。这是关于如何为不同的RPC许可不同用户的代码示例。在实际用例中,您很可能从数据库中获取变量usersrpcs

现在,只要客户端调用ds.rpc.make( 'set-user-data',...,服务器就会查找rpc需要的权限('canEditUser')以及用户是否拥有该权限(mike:true,lisa:false)

var DeepstreamServer = require( 'deepstream.io' );
var server = new DeepstreamServer();
var C = server.constants;
var users = {
    'mike': { canEditUser: true },
    'lisa': { canEditUser: false }
};
var rpcs = {
    'set-user-data': 'canEditUser'
};

server.set( 'permissionHandler', {
    isValidUser: function( connectionData, authData, callback ) {
        if( !authData.username ) {
            callback( 'no username specified' );
        }
        else if( users[ authData.username ] ) {
            callback( null, authData.username );
        }
    },
    canPerformAction: function( username, message, callback ) {
        var isIncomingRpc = message.topic === C.TOPIC.RPC && message.action === C.ACTIONS.REQUEST;

        if( isIncomingRpc ) {
            var rpcName = message.data[ 0 ];

            if( rpcs[ rpcName ] === undefined ) {
                callback( 'Unknown RPC ' + rpcName );
                return;
            }

            var userPermissions = users[ username ];
            var requiredRpcPermissions = rpcs[ rpcName ];
            var isPermissioned = userPermissions[ requiredRpcPermissions ];

            callback( null, isPermissioned );

        }
    }
});

server.start();