我想開發一個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纔有權讀取影子。我不知道我將如何繞過這一點,但至少現在我知道這是什麼問題!
我認爲,這個模塊允許使用HTTP認證(彈出登陸框),並驗證使用PAM憑據,並且不會干擾Python。儘管如此,我仍然嘗試過,但它沒有奏效。 – simark 2010-04-03 02:20:13