2011-08-08 56 views
0

我在python中創建了一組XMLRPC客戶端服務器程序,並設置了一個用於身份驗證客戶端的小方法。然而,在完成了大部分代碼的編碼之後,我意識到一旦客戶端得到認證,我爲其設置的標誌就是全球性的,即只要一個客戶端通過認證,所有客戶端都通過認證。我不知道爲什麼,但我的印象是,無論何時SimpleXMLRPCServer被客戶端連接,它都會在我的程序中創建一組新的變量。針對多個客戶端的Python服務器(帶或不帶XMLRPC)

基本上它的成立,現在的方式是

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」

+0

你在那裏做的方式是,認證的變量對於實例是本地的,而不是類,假設你只聲明/使用'authenticated'內部的實例方法。如果情況並非如此,則需要更新代碼以向我們展示使認證屬於類而不是實例的原因。 – agf

+0

我改變了一點,但我不想讓變量屬於實例?我現在遇到的問題是每次連接到服務器時都沒有創建對象的新實例,這幾乎是我想要的。或者可能爲每個調用創建一個具有自己的認證變量的新線程。 –

+0

啊,我明白了,現在回答。 – agf

回答

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作爲變量名。請記住接受你的問題的答案(我注意到你沒有爲你的最後幾個答案)。

+0

謝謝,這是一個非常快速的修復。我想我仍然可以用扭曲的方法來重新編碼,但現在這種方法仍然有效(如果我每秒收到幾個請求,我不知道這會起作用)。 –

0

你必須決定。如果您真的想爲所有客戶端使用一個實例,則必須在其他位置存儲「已認證」狀態。我對SimpleXMLRPCServer()並不熟悉,但是如果您可以在某處獲得連接對象,或者至少獲得其源地址,則可以在其中註冊所有經過身份驗證的客戶端/連接/任何位置的set()。

相關問題