2013-04-06 3 views
6

Я пытаюсь создать простую регистрационную форму и пароль с помощью словаря. Он отлично работает, кроме той части, где он проверяет, соответствует ли логин паролю (внизу, где указано «Вход в систему успешно!»).Простое имя пользователя и пароль в Python

Если бы я должен был создать логин 'a' и пароль 'b', а затем создать логин 'b' и пароль '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") 

Редактировать

Теперь, когда это работает, я пытаюсь разделить приложение на три функции, в целях удобства чтения. Он работает, за исключением того, что я получаю бесконечный цикл.

Любые предложения, почему?

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

Отъезд [GetPass] (Http: // документы .python.org/2/library/getpass.html) (часть установки Python), чтобы люди не могли видеть пароль по мере его ввода. Затем перейдите к [хеширование] (http://docs.python.org/2/library/hashlib.html), поэтому вам не нужно хранить пароль незашифрованного текста. –

+0

Спасибо за совет :) – 2013-04-06 03:17:06

+0

Попробуйте иметь отдельную функцию для проверки «существующих пользователей», ее хорошей практики программирования. – vivek

ответ

3

Прямо сейчас вы проверяете, соответствует ли данный пароль passw в users (не справа). Вам нужно узнать, соответствует ли введенный пароль данному паролю определенного пользователя. Так как вы уже проверили, если имя пользователя существует в ключам словаря вы не должны проверить еще раз, так что попробовать что-то вроде:

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

EDIT:

Для вашего обновленного кода, я собираюсь предположим, что «бесконечный цикл» означает, что вы не можете использовать q для выхода из программы. Это связано с тем, что, когда вы находитесь внутри displayMenu, вы сохраняете пользовательский ввод в локальной переменной по имени status. Эта локальная переменная не относятся к тому же status, где вы проверки,

while status != "q": 

Другими словами, вы используете переменную status в двух различных областей (изменение внутренней рамки не изменяет внешнее).

Есть много способов, чтобы исправить это, один из которых будет изменение,

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

И добавив оператор возврата в конце displayMenu, как это так,

return status 

Делая это, вы сохраняете новое значение status из локальной области displayMenu в глобальную область вашего сценария, чтобы цикл while мог работать правильно.

Другим способом было бы добавить эту строку в начале displayMenu,

global status 

Это говорит Python, что status в displayMenu относится к глобальной контекстными status переменной, а не новый локальный области видимости один.

+0

Что вы подразумевали под _ «Поскольку вы уже проверили, существует ли имя пользователя в ключах словаря, вам не нужно снова проверять« _? Еще раз проверьте, что? – 2013-04-06 02:56:23

+1

@air_wizardo Вложенные операторы if. 'login' не изменится, так как вы в последний раз проверяли, что он находится в' users' (keys). – Jared

+0

Я не уверен, что понимаю, что вы имеете в виду. – 2013-04-06 03:09:52

1

изменение

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

в

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

Кроме того, вы не должны сказать, что хакеры "Пользователь не существует!". Лучшим решением является рассказать общую причину, например: «Пользователь не существует или ошибка пароля!»

+0

Верно этому моему другу. – 2013-04-06 02:53:01

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

Это слишком продвинуто для меня, поскольку я новичок. Но все равно спасибо. – 2013-04-06 12:28:15

+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

Это очень простой, основанный на одной ранее для одного пользователя с улучшенными грамматике и исправления ошибок:

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() 
Смежные вопросы