2011-08-08 5 views
0

파이썬에서 일련의 XMLRPC 클라이언트 - 서버 프로그램을 만들고 내 클라이언트를 인증하는 간단한 방법을 설정했습니다. 그러나 모든 것을 거의 코딩 한 후에는 일단 클라이언트가 인증되면 내가 설정 한 플래그가 클래스에서 글로벌이라는 것을 깨달았습니다. 즉 한 클라이언트가 인증되면 모든 클라이언트가 인증됩니다. 이유는 모르겠지만 SimpleXMLRPCServer가 클라이언트에 연결될 때마다 내 프로그램에 새로운 변수 집합이 만들어 질 것이라는 인상을 받았습니다.XMLRPC 유무에 관계없이 여러 클라이언트 용 Python Server

는 기본적으로 지금까지 설정되어 방식은

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

당신은 결정해야합니다. 정말로 모든 클라이언트에 하나의 인스턴스를 사용하려면 다른 곳에 "인증 된"상태를 저장해야합니다. 필자는 SimpleXMLRPCServer()에 익숙하지 않지만 연결 객체를 어딘가에 가져올 수 있거나 소스 주소가 최소한이라면 set()을 설정할 수 있습니다. 여기서 모든 인증 된 클라이언트/연결/등록 된 모든 것이 있습니다.

관련 문제