2013-04-06 7 views
6

辞書を使用して簡単なログインとパスワードアプリケーションを構築しようとしています。それは、ログインがパスワードと一致するかどうかをチェックする部分を除いて正常に機能します(下部に「ログインに成功しました!」)。Pythonでの単純なユーザー名とパスワードのアプリケーション

ログイン 'a'とパスワード 'b'を作成し、ログイン 'b'とパスワード 'a'を作成すると、ログイン 'a'とパスワードでログインしようとするとログインします'a'。これらの文字が辞書のどこかに存在するかどうかをチェックしますが、それがペアであるかどうかはチェックしません。

これを修正する方法を教えてください。

users = {} 
status = "" 

while status != "q": 
    status = raw_input("Are you a registered user? y/n? Press q to quit: ") 

    if status == "n": #create new login 
     createLogin = raw_input("Create login name: ") 

     if createLogin in users: # check if login name exist in the dictionary 
      print "Login name already exist!\n" 
     else: 
      createPassw = raw_input("Create password: ") 
      users[createLogin] = createPassw # add login and password 
      print("\nUser created!\n")  

    elif status == "y": #login the user 
     login = raw_input("Enter login name: ") 

     if login in users: 
      passw = raw_input("Enter password: ") 
      print 

      if login in users and passw in users: # login matches password 
       print "Login successful!\n" 

     else: 
      print 
      print("User doesn't exist!\n") 

編集

さて、これが動作していることを、私は読みやすさのために、三つの機能にアプリケーションを分割しようとしています。私は無限のループを得ることを除いて、それは動作します。

どのような理由がありますか?

if users[login] == passw: # login matches password 

users = {} 
status = "" 

def displayMenu(): 
    status = raw_input("Are you a registered user? y/n? Press q to quit: ") 
    if status == "y": 
     oldUser() 
    elif status == "n": 
     newUser() 

def newUser(): 
    createLogin = raw_input("Create login name: ") 

    if createLogin in users: # check if login name exists 
     print "\nLogin name already exist!\n" 
    else: 
     createPassw = raw_input("Create password: ") 
     users[createLogin] = createPassw # add login and password 
     print("\nUser created!\n")  

def oldUser(): 
    login = raw_input("Enter login name: ") 
    passw = raw_input("Enter password: ") 

    # check if user exists and login matches password 
    if login in users and users[login] == passw: 
     print "\nLogin successful!\n" 
    else: 
     print "\nUser doesn't exist or wrong password!\n" 

while status != "q":    
    displayMenu() 
+1

.python.org/2/library/getpass.html)ライブラリ(Pythonインストールの一部)を使用して、入力時にパスワードが表示されないようにします。その後、[ハッシュ](http://docs.python.org/2/library/hashlib.html)に移動して、平文のパスワードをこれまで保存する必要はありません。 –

+0

アドバイスありがとう:) –

+0

「既存のユーザー」を確認するための別の機能を持つようにしてください。その優れたプログラミング方法です。 – vivek

答えて

3

ここでは、特定のパスワードpasswのキーusers)(正しくはありません)と一致するかどうかを確認しています。入力したパスワードが特定のユーザーのパスワードと一致するかどうかを確認する必要があります。

if passw == users[login]: 
    print "Login successful!\n" 

EDIT:あなたはすでにユーザ名が辞書のキーに存在する場合は、もう一度チェックする必要があり、そのような何かしようとしないでチェックしていますので、あなたの更新されたコードのために

を、私はするつもりです「無限ループ」と仮定すると、qを使用してプログラムを終了することはできません。これは、displayMenuの内部にあるときに、ローカル変数statusにユーザー入力を保存するためです。このローカル変数は、あなたがチェックしているのと同じstatusに言い換える

while status != "q": 

を参照していない、あなたは変数statusに2つの異なるスコープを使用している(内側のスコープを変更すると、外は変更されません)。

があり変更されるだろう一つは、この問題を解決するには多くの方法、あり、

while status != "q": 
    status = displayMenu() 

そして

return status 

これを行うことにより、そのようなdisplayMenuの最後にreturn文を追加し、 whileループが正常に機能するように、statusの新しい値をdisplayMenuのローカルスコープからスクリプトのグローバルスコープに保存しています。

もう一つの方法は、

global status 

これはdisplayMenustatusはグローバルスコープstatus変数を参照し、新しいローカルではないが、1スコープというのPythonを伝え、displayMenuの先頭に次の行を追加することです。

+0

あなたは何を意味しましたか?「ユーザー名が辞書のキーに存在するかどうかをチェックしているので、もう一度チェックする必要はありません」_何をもう一度チェックする? –

+1

@air_wizardoネストされたif文。最後に 'users'(キー)に入っていることを確認してから' login'は変更されません。 – Jared

+0

私はあなたが何を意味するのか分かりません。 –

1

変更

if login in users and passw in users: # login matches password 

以外にも、あなたは "ユーザーが存在しません!" というハッカーに伝えるべきではありません。より良い解決策は、「ユーザーは存在しないか、パスワードエラーです!」といった一般的な理由を伝えることです。

+0

それは本当に私の友人です。 –

0

パスワードをオンラインにする場合は、パスワードをデータベースに暗号化してください。 良い仕事。

import md5 
import sys 
# i already made an md5 hash of the password: PASSWORD 
password = "319f4d26e3c536b5dd871bb2c52e3178" 
def checkPassword(): 
    for key in range(3): 
     #get the key 
     p = raw_input("Enter the password >>") 
     #make an md5 object 
     mdpass = md5.new(p) 
     #hexdigest returns a string of the encrypted password 
     if mdpass.hexdigest() == password: 
      #password correct 
      return True 
     else: 
      print 'wrong password, try again' 
    print 'you have failed' 
    return False 

def main(): 
    if checkPassword(): 
     print "Your in" 
     #continue to do stuff 

    else: 
     sys.exit() 
if __name__ == '__main__': 
    main() 
+0

私は初心者なのでこれはあまりにも進んでいます。とにかくありがとう。 –

+2

'md5'を使わないでください。それは廃止されました。代わりに 'hashlib'を使用してください。また、MD5アルゴリズムには既知の脆弱性が存在するため、SHA256やSHA512のようなものが良い選択となります。 –

0
usrname = raw_input('username :  ') 
if usrname == 'username' : 
    print 'Now type password ' 

else : 
    print 'please try another user name .this user name is incorrect' 


pasword = raw_input ('password  : ') 
if pasword == 'password' : 
    print ' accesses granted ' 
    print ' accesses granted ' 
    print ' accesses granted ' 
    print ' accesses granted ' 
    print 'this service is temporarily unavailable' 

else : 
    print 'INTRUDER ALERT !!!!' , 'SYSTEM LOCKED' 
    print 'INTRUDER ALERT !!!!' , 'SYSTEM LOCKED' 
    print 'INTRUDER ALERT !!!!' , 'SYSTEM LOCKED' 
    exit() 
0

これは、改善の文法とバグ修正を持つ単一のユーザのために、以前のいずれかに基づいて非常にシンプルなものです://ドキュメント:[GETPASS](HTTPをチェック

print("Steam Security Software ©") 
print("-------------------------") 
print("<<<<<<<<<Welcome>>>>>>>>>") 
username = input("Username:") 
if username == "username" : 
    print ("Now type password") 

else : 
    print ("please try another user name. This user name is incorrect") 


password = input ("Password:") 
if password == "password" : 
    print ("ACCESS GRANTED") 
    print ("<<Welcome Admin>>") 
    #continue for thins like opening webpages or hidden files for access 

else : 
    print ("INTRUDER ALERT !!!!" , "SYSTEM LOCKED") 
    exit() 
関連する問題