2011-08-08 7 views
0

私はPythonでXMLRPCクライアントサーバープログラムのセットを作り、クライアントを認証するための少しの方法を設定しました。しかし、ほとんどすべてをコーディングした後、クライアントが認証されると、私が設定したフラッグは、クラス内でグローバルであることに気付きました。つまり、1つのクライアントが認証される限り、すべてのクライアントが認証されます。理由は分かりませんが、SimpleXMLRPCServerがクライアントによって接続されるたびに、自分のプログラムに新しい変数セットが作成されるという印象を受けました。XMLRPCの有無にかかわらず複数のクライアント用のPythonサーバー

は、基本的にそれが今セットアップされた方法は、

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

は私が(接続するクライアントごとに設定する必要がありますすなわち、認証フラグ)私は何を探していますにこれをハックする方法のいずれかが必要である、またはこれをより簡単に行うことができる別のプロトコルです。いくつかの検索の後、私はツイストを見てきましたが、これは既に書かれているので、書き直すよりもむしろ変更したいと思います。私は今のところ、クライアントからのユーザ名とパスワードを常に得ることができますが、(要求ごとに認証する)リソースと(クライアントの中には非常に限られた数量の)帯域幅を保存するという点では、むしろそれをしないでください。

また、私はこのようなものを安全にしようとしています(インターネットセキュリティで訓練されていません)ので、私のロジックでいくつかの目障りなエラーが見落とされている場合は教えてください。基本的に、私は私にこのような

+0

ここで行ったやり方では、認証された変数はインスタンスメソッド内で 'authenticated'を宣言/使用するだけで、クラスではなくインスタンスに対してローカルになります。そうでない場合は、認証されたものがインスタンスではなくクラスに属することを示すためにコードを更新する必要があります。 – agf

+0

私はそれをちょっと変えましたが、変数をインスタンスに属させたくありませんか?私が今問題を抱えているのは、サーバーに接続するたびにオブジェクトの新しいインスタンスを作成していないということです。あるいは、それぞれの呼び出しに対して独自の認証された変数を使用して新しいスレッドを作成することもできます。 –

+0

ああ、私は見て、今答える。 – agf

答えて

0

何かが働くだろう「other_actions」の偽の変数を送信する誰かを持つことはできません。

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

あなたは決定する必要があります。本当にすべてのクライアントに対して1つのインスタンスを使用する場合は、「認証済み」状態を別の場所に保存する必要があります。私はSimpleXMLRPCServer()に精通していませんが、conectionオブジェクトをどこかで取得することができれば、またはソースアドレスを取得することができます。

関連する問題