适用于具有或不具有XMLRPC的多个客户端的Python Server

时间:2011-08-08 05:51:11

标签: python multithreading xml-rpc

我在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()

我需要一种方法来破解我正在寻找的东西(即需要为每个连接的客户端设置经过身份验证的标志),或者另一种可以更轻松地执行此操作的协议。经过一番搜索,我一直在看扭曲,但由于这已经写好了,我宁愿修改它而不是重写它。我知道现在我总是可以从客户端获得用户名和密码,但是在最有用的资源(必须对每个请求进行身份验证)和节省带宽(我的一些客户的数量非常有限),我会而不是那样做。

此外,这是我第一次尝试保护这样的东西(我没有接受过互联网安全方面的培训),所以如果我在逻辑中忽略了一些明显的错误,请告诉我。基本上,我不能让别人在“other_actions”

中向我发送虚假变量

2 个答案:

答案 0 :(得分:0)

这样的事情会起作用:

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作为变量名。请记住接受你的问题的答案(我注意到你没有为你的最后几个问题)。

答案 1 :(得分:0)

你必须决定。如果您确实要为所有客户端使用一个实例,则必须将“已验证”状态存储在其他位置。我不熟悉SimpleXMLRPCServer(),但是如果你可以在某个地方获得连接对象,或者至少是它的源地址,你可以建立一个set(),其中所有经过身份验证的客户端/连接/任何已注册。