2010-04-02 38 views
2

我想開發一個Web界面,以允許Linux系統的用戶執行與其帳戶相關的某些任務。我決定在Apache上使用Python和mod_python編寫網站的後端。爲了驗證用戶,我想我可以使用python_pam來查詢PAM服務。我適應與模塊捆綁example和得到這個:在使用mod_python運行的腳本中使用pam_python

# out is the output stream used to print debug 
def auth(username, password, out): 
    def pam_conv(aut, query_list, user_data): 
     out.write("Query list: " + str(query_list) + "\n") 

     # List to store the responses to the different queries 
     resp = [] 

     for item in query_list: 
      query, qtype = item 

      # If PAM asks for an input, give the password 
      if qtype == PAM.PAM_PROMPT_ECHO_ON or qtype == PAM.PAM_PROMPT_ECHO_OFF: 
       resp.append((str(password), 0)) 

      elif qtype == PAM.PAM_PROMPT_ERROR_MSG or qtype == PAM.PAM_PROMPT_TEXT_INFO: 
       resp.append(('', 0)) 

     out.write("Our response: " + str(resp) + "\n") 
     return resp 

    # If username of password is undefined, fail 
    if username is None or password is None: 
     return False 

    service = 'login' 
    pam_ = PAM.pam() 
    pam_.start(service) 

    # Set the username 
    pam_.set_item(PAM.PAM_USER, str(username)) 

    # Set the conversation callback 
    pam_.set_item(PAM.PAM_CONV, pam_conv) 

    try: 
     pam_.authenticate() 
     pam_.acct_mgmt() 
    except PAM.error, resp: 
     out.write("Error: " + str(resp) + "\n") 
     return False 
    except: 
     return False 

    # If we get here, the authentication worked 
    return True 

我的問題是,無論我在一個簡單的腳本或通過mod_python的使用這個功能不相同的行爲。爲了說明這一點,我寫這些簡單的情況:

my_username = "markys" 
my_good_password = "lalala" 
my_bad_password = "lololo" 

def handler(req): 
req.content_type = "text/plain" 
req.write("1- " + str(auth(my_username,my_good_password,req) + "\n")) 
req.write("2- " + str(auth(my_username,my_bad_password,req) + "\n")) 
return apache.OK 

if __name__ == "__main__": 
print "1- " + str(auth(my_username,my_good_password,sys.__stdout__)) 
print "2- " + str(auth(my_username,my_bad_password,sys.__stdout__)) 

該腳本的結果是:

Query list: [('Password: ', 1)] 
Our response: [('lalala', 0)] 
1- True 
Query list: [('Password: ', 1)] 
Our response: [('lololo', 0)] 
Error: ('Authentication failure', 7) 
2- False 

但是從mod_python的結果是:

Query list: [('Password: ', 1)] 
Our response: [('lalala', 0)] 
Error: ('Authentication failure', 7) 
1- False 
Query list: [('Password: ', 1)] 
Our response: [('lololo', 0)] 
Error: ('Authentication failure', 7) 
2- False 

我不明白爲什麼auth函數在給定相同輸入的情況下不會返回相同的值。任何想法,我得到這個錯誤? Here是原始腳本,如果這可以幫助你。

非常感謝!

編輯:好吧,我發現錯誤。我以root身份運行腳本。 mod_python作爲網絡服務器的用戶運行腳本。只有root纔有權讀取影子。我不知道我將如何繞過這一點,但至少現在我知道這是什麼問題!

回答

0

看來你必須啓用Apache來使用PAM認證。看看這個網站:http://www.debianhelp.co.uk/apachepam.htm

你可能想看看這個網站太:http://inming.net/?p=86

+0

我認爲,這個模塊允許使用HTTP認證(彈出登陸框),並驗證使用PAM憑據,並且不會干擾Python。儘管如此,我仍然嘗試過,但它沒有奏效。 – simark 2010-04-03 02:20:13