带或不带XMLRPC的Python多客户端服务器
我用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
不能用作变量名。还有,请记得对你提问得到的答案表示认可(我注意到你最近几个问题都没有接受答案)。