带或不带XMLRPC的Python多客户端服务器

0 投票
2 回答
1804 浏览
提问于 2025-04-16 23:06

我用Python写了一套XMLRPC的客户端-服务器程序,并设置了一个小方法来验证我的客户端。不过,在几乎把整个程序写完后,我意识到一旦一个客户端通过了验证,我在类中设置的标志是全局的,也就是说,只要有一个客户端通过了验证,所有的客户端都算通过了。我不知道为什么,我一直以为每当SimpleXMLRPCServer连接一个客户端时,它会在我的程序中创建一组新的变量。

现在的设置基本上是这样的:

class someclass:
    authenticate(self, username, pass):
        #do something here
        if(check_for_authentication(username, pass))
             self.authenticated=True
    other_action(self, vars):
        if authenticated:
            #do whatever
        else:
            return "Not authorized."

server=SimpleXMLRPCServer.SimpleXMLRPCServer("0.0.0.0", 8000)
server.register_instance(someclass())
server.serve_forever()

我需要找到一种方法来解决这个问题(也就是说,验证标志需要为每个连接的客户端单独设置),或者找一个更简单的协议来实现这个功能。在搜索了一段时间后,我开始关注twisted,但因为这个程序已经写好了,我更愿意修改它,而不是重写。我知道现在我可以每次都从客户端获取用户名和密码,但考虑到资源(每次请求都要验证)和节省带宽(我的一些客户端的带宽非常有限),我不想这样做。

另外,这是我第一次尝试保护这样的东西(而且我没有接受过网络安全的培训),所以如果我在逻辑上忽略了什么明显的错误,请告诉我。基本上,我不能让别人通过“other_actions”发送假变量给我。

2 个回答

0

你需要做个决定。如果你真的想让所有客户都使用同一个实例,那么你就得把“已认证”的状态存储在别的地方。我对SimpleXMLRPCServer()不太了解,但如果你能在某个地方获取到连接对象,或者至少知道它的来源地址,你就可以建立一个集合,把所有已认证的客户、连接或者其他的都登记在里面。

1

像这样就可以了:

class SomeClass(object):
    authenticated = {}
    def authenticate(self, username, password):
        #do something here
        if authenticate(username, password):
            # make unique token can probably be just a hash
            # of the millisecond time and the username
            self.authenticated[make_unique_token(username)] = True
    def other_action(self, vars):
        # This will return True if the user is authenticated
        # and None otherwise, which evaluates to False
        if authenticated.get(vars.get('authentication-token')):
            #do whatever
            pass
        else:
            return "Not authorized."

server=SimpleXMLRPCServer.SimpleXMLRPCServer("0.0.0.0", 8000)
server.register_instance(someclass())
server.serve_forever()

你只需要在他们登录后给他们一个认证令牌。

我想你应该知道,pass 不能用作变量名。还有,请记得对你提问得到的答案表示认可(我注意到你最近几个问题都没有接受答案)。

撰写回答