Как предотвратить регистрацию с существующим именем пользователя? - PullRequest
0 голосов
/ 29 марта 2020

Я пытаюсь создать приложение форума, используя Python. Моя функция входа в систему:

uname = username_const.get()
pword = password_const.get()

# this will delete the entry after login button is pressed
username.delete(0, END)
password.delete(0, END)

conn = sqlite3.connect('users_info.db')
c = conn.cursor()
c.execute("SELECT username, password FROM users")
account_list = c.fetchall()
flag = True
for account in account_list:
    if uname == account[0] and pword == account[1]:
        raise_frame(exsisting_account_frame)  # allow the user to log into his account
        flag = False
    elif uname == account[0]:
        password_not_recognised() #presents an error message
        flag = False
if flag:
    user_not_found() #presents an error message

Моя функция регистрации (не разрешает уже существующее / занятое имя пользователя):

new_uname = newUsername_const.get()

conn = sqlite3.connect('users_info.db')
c = conn.cursor()

c.execute("SELECT username FROM users")
usernames = c.fetchall()

for user_name in usernames:
    if user_name == new_uname:
        username_already_exists()
        flag = False
        break
    else:
        flag = True

if flag:
    new_fname = name_const.get()
    new_mail = mail_const.get()
    new_uname = newUsername_const.get()
    new_pword = newPassword_const.get()

    FullName.delete(0, END)
    mailAccount.delete(0, END)
    newUsername.delete(0, END)
    newPassword.delete(0, END)

    conn = sqlite3.connect('users_info.db')
    c = conn.cursor()
    c.execute("INSERT INTO users (fullname, mail, username, password) VALUES(?,?,?,?)",
              (new_fname, new_mail, new_uname, new_pword))
    raise_frame(new_account_frame)
    conn.commit()

Функция входа работает, но регистрация функциональность по-прежнему позволяет использовать имя пользователя. Как я могу это исправить?

Ответы [ 2 ]

1 голос
/ 30 марта 2020

"... как я могу это исправить ?? "

Определить UNIQUE ограничение для столбца username:

CREATE TABLE users (
    id          INTEGER PRIMARY KEY,
    regdate     TEXT            NOT NULL    DEFAULT CURRENT_TIMESTAMP,
    fullname    TEXT,
    mail        TEXT    UNIQUE  NOT NULL,
    username    TEXT    UNIQUE  NOT NULL,
    password    TEXT            NOT NULL
);

SQLite возвращает ошибку нарушения ограничения для операторов INSERT, содержащих уже существующие имена пользователей (и / или адреса электронной почты) в настоящее время (целостность данных должна обеспечиваться базой данных, а не приложением). Дополнительная информация (нажмите ограничение таблицы ). Пропуск столбцов id и regdate в операторах INSERT присваивает им значения по умолчанию.

"... Функции регистрации по-прежнему позволяют регистрироваться в приложении с использованием взятых учетная запись, сохраненная в базе данных ..."

Запрос существующего имени пользователя, например:

SELECT count(*) FROM users WHERE username = 'already_taken_username_here';

Возвращает одну запись, одно поле, содержащее либо 0, либо 1 (не требуется ни for -l oop, ни flag переменная).

Рассмотрите возможность сохранения password как га sh (вместо простого текста). Ха sh ввод пароля (при входе в систему) перед сравнением с записью базы данных.

0 голосов
/ 29 марта 2020

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...