簡體   English   中英

Python SimpleXMLRPCServer:獲取用戶IP和簡單身份驗證

[英]Python SimpleXMLRPCServer: get user IP and simple authentication

我正在嘗試使用Python制作一個非常簡單的XML RPC服務器,該服務器提供基本的身份驗證以及獲取連接的用戶IP的能力。 讓我們來看一下http://docs.python.org/library/xmlrpclib.html中提供的示例:

import xmlrpclib
from SimpleXMLRPCServer import SimpleXMLRPCServer

def is_even(n):
    return n%2 == 0

server = SimpleXMLRPCServer(("localhost", 8000))
server.register_function(is_even, "is_even")
server.serve_forever()

因此,現在,這背后的第一個想法是讓用戶提供憑據並對其進行處理,然后再允許其使用功能。 我需要非常簡單的身份驗證,例如僅一個代碼。 現在,我正在執行的是強制用戶在函數調用中提供此代碼,並使用if語句對其進行測試。

第二個是當用戶調用函數時能夠獲得用戶IP或在連接服務器后將其存儲。

此外,我已經在運行Apache Server,將其集成到其中可能會更簡單。

你怎么看?

這是一個相關的問題,我發現有幫助:

Python SimpleXMLRPCServer中客戶端的IP地址?

對我而言,有效的方法是在服務器的覆蓋的finish_request方法中獲取client_address,將其存儲在服務器本身中,然后在覆蓋的服務器_dispatch例程中對其進行訪問。 您也許也可以從該方法內部訪問服務器本身,但是我只是試圖將IP地址作為自動第一個參數添加到我的所有方法調用中。 我使用dict的原因是因為我還將添加會話令牌以及其他元數據。

from xmlrpc.server import DocXMLRPCServer
from socketserver import BaseServer

class NewXMLRPCServer( DocXMLRPCServer):

    def finish_request( self, request, client_address):
        self.client_address = client_address
        BaseServer.finish_request( self, request, client_address)

    def _dispatch( self, method, params):
        metadata = { 'client_address' : self.client_address[ 0] }
        newParams = ( metadata, ) + params
        return DocXMLRPCServer._dispatch( self, method, metadata)

請注意,這會破壞諸如system.listMethods()之類的自省功能,因為這不需要額外的參數。 一種想法是檢查“系統”的方法名稱。 並在這種情況下通過常規參數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM