【问题标题】:Python Server for multiple clients with or without XMLRPC用于具有或不具有 XMLRPC 的多个客户端的 Python 服务器
【发布时间】:2011-08-08 05:51:11
【问题描述】:

我在 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”中向我发送虚假变量

【问题讨论】:

  • 你在那里做的方式,认证变量是实例的本地变量,而不是类,假设你只在实例方法中声明/使用authenticated。如果不是这种情况,您需要更新您的代码,以向我们展示是什么让经过身份验证的属于类而不是实例。
  • 我稍微改了一下,但我不希望变量属于实例吗?我现在遇到的问题是每次连接到服务器时我都没有创建对象的新实例,这几乎是我想要的。或者也许为每次调用创建一个新线程,使用它自己的身份验证变量。
  • 你知道如果你考虑过使用像 twisted 这样的框架,这不是问题
  • 是的,在做了一点压力测试之后,即使每 1/10 秒发送一个事件有时也会给我带来错误。我认为这根本不是我想要使用的协议。

标签: python multithreading xml-rpc


【解决方案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 作为变量名。请记住接受对您问题的回答(我注意到您最近几次都没有)。

【讨论】:

  • 谢谢,这是一个非常快速的解决方案。我想我仍然可以用twisted 重新编码,但是现在可以正常工作(如果我每秒收到几个请求,我不知道这将如何工作)。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-02
    • 2018-01-04
    • 1970-01-01
    相关资源
    最近更新 更多