限制对 RPC 端点的访问
Restrict access to RPC endpoints
我想知道 deepstream 是否提供现成的解决方案来制作端点 private/public。如果不是,我想知道如何在服务器端跟踪正确的深度流调用以仅允许某些端点?我相信我需要提供实现 canPerformAction 的 permissionHandler 并检查它是否是 RPC 调用所需的授权以及调用者是否已正确授权执行此操作。这样想对吗?我正在查看文档并了解我对主题 P 感兴趣,但我不知道什么是检查的正确操作。
https://deepstream.io/docs/constants.html
提前致谢!
您的方法很到位。下面是有关如何为不同的 RPC 授予不同用户权限的代码示例。在现实世界的用例中,您很可能会从数据库中获取变量 users
和 rpcs
。
所以现在每当客户端调用 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();
我想知道 deepstream 是否提供现成的解决方案来制作端点 private/public。如果不是,我想知道如何在服务器端跟踪正确的深度流调用以仅允许某些端点?我相信我需要提供实现 canPerformAction 的 permissionHandler 并检查它是否是 RPC 调用所需的授权以及调用者是否已正确授权执行此操作。这样想对吗?我正在查看文档并了解我对主题 P 感兴趣,但我不知道什么是检查的正确操作。 https://deepstream.io/docs/constants.html
提前致谢!
您的方法很到位。下面是有关如何为不同的 RPC 授予不同用户权限的代码示例。在现实世界的用例中,您很可能会从数据库中获取变量 users
和 rpcs
。
所以现在每当客户端调用 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();