Как создать пару логин пароль в python
Перейти к содержимому

Как создать пару логин пароль в python

  • автор:

Python: Авторизация в базе пользователей

В системе ejudge различается несколько уровней привилегий пользователей:

  • Обычный пользователь. Для него доступны только возможности, заданные в конфигурационном файле турнира.
  • Координатор, проверяющий, старший проверяющий. Имеют ограниченные возможности по ручной проверке решений и по назначению проверяющих на проверку решений. В данный момент эти привилегии не реализованы до конца.
  • Судья. Имеет возможность использовать административный интерфейс new-judge. Точные полномочия для судьи устанавливаются с помощью бит полномочий в конфигурационном файле турнира. В частности, к судьям относятся и наблюдатели, которые могут следить за ходом турнира, но не могут в него вмешиваться.
  • Администратор. Имеет возможность использовать административный интерфейс new-master. Точные полномочия для администраторов устанавливаются с помощью бит полномочий в конфигурационном файле турнира.

Авторизация выполняется один раз при работе с сервером. Уже авторизованное соединение не может быть авторизовано по-другому.

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

Для обычных пользователей различаются два вида авторизации: общая авторизация и авторизация на конкретный турнир. Общая авторизация производится при создании новых пользователей, регистрации пользователя на турнир и т. п., то есть при выполнении операций в программе new-register. Авторизация на конкретный турнир выполняется при входе в программу new-client. Авторизация на турнир может требовать отдельного пароля, накладывать другие ограничения на IP-адреса и т. д. Поэтому для участия в турнире (сдачи задач, просмотра текущих результатов и т. д.) необходима турнирная авторизация. Для изменения регистрационных настроек необходима регистрационная авторизация.

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

Далее кратко рассматриваются поддерживаемые запросы на авторизацию соединения.

Contents

  • 1 Авторизация обычных пользователей
    • 1.1 login
    • 1.2 loginBySID
    • 1.3 contestLogin
    • 1.4 contestLoginBySID
    • 2.1 adminProcess
    • 2.2 privLogin
    • 2.3 privLoginBySID

    Авторизация обычных пользователей

    login

    Для регистрационной авторизации по логину и паролю используется метод login

    res = clnt.login(ip_str, ssl_flag, contest_id, locale_id, login, password)

    Идентификатор турнира может быть равен 0. Если операция завершилась с ошибкой выбрасывается исключение IOError. Если операция завершилась успешно, то res — это словарь следующего вида:

    < 'user_id' : user_id, 'sid' : sid, 'name' : name >

    Возвращаемое имя пользователя name соответствует указанному турниру contest_id.

    loginBySID

    Метод используется для регистрационной авторизации непривилегированного пользователя по сессионному ключу

    res = clnt.contestLoginBySID(ip_str, ssl_flag, contest_id, sid)

    Идентификатор турнира может быть равен 0. Если операция завершилась с ошибкой выбрасывается исключение IOError. Если операция завершилась успешно, то res — это словарь следующего вида:

    < 'user_id' : user_id, 'locale_id' : locale_id, 'login': login, 'name' : name >

    Возвращаемое имя пользователя name соответствует указанному турниру contest_id.

    contestLogin

    Для турнирной авторизации по логину и паролю используется метод contestLogin

    res = clnt.contestLogin(ip_str, ssl_flag, contest_id, locale_id, login, password)

    Идентификатор турнира не может быть равен 0. Если операция завершилась с ошибкой выбрасывается исключение IOError. Если операция завершилась успешно, то res — это словарь следующего вида:

    < 'user_id' : user_id, 'sid' : sid, 'name' : name >

    Возвращаемое имя пользователя name соответствует указанному турниру contest_id.

    contestLoginBySID

    Метод используется для авторизации непривилегированного пользователя на турнир по сессионному ключу

    res = clnt.contestLoginBySID(ip_str, ssl_flag, contest_id, sid)

    Идентификатор турнира не может быть равен 0. Если операция завершилась с ошибкой выбрасывается исключение IOError. Если операция завершилась успешно, то res — это словарь следующего вида:

    < 'user_id' : user_id, 'locale_id' : locale_id, 'login': login, 'name' : name >

    Возвращаемое имя пользователя name соответствует указанному турниру contest_id.

    Авторизация привилегированных пользователей

    adminProcess

    Для авторизации с правами администратора на основе полномочий системы linux можнно использовать метод adminProcess

    res = clnt.adminProcess()

    Для авторизации используется идентификатор пользователя linux. Пользователи linux отображаются в пользователей ejudge с помощью отображения пользователей в конфигурационном файле ejudge.xml. Если операция завершилась успешно, то res — это словарь следующего вида:

    < 'user_id' : user_id, 'sid' : sid, 'name' : name >

    Возвращаемое имя пользователя name соответствует турниру по умолчанию (турнир 0).

    privLogin

    Для авторизации с правами администратора по логину и паролю используется метод privLogin

    res = clnt.privLogin(ip_str, ssl_flag, contest_id, locale_id, priv_role, login, password)

    Если операция завершилась с ошибкой выбрасывается исключение IOError. Если операция завершилась успешно, то res — это словарь следующего вида:

    < 'user_id' : user_id, 'sid' : sid, 'priv_level' : priv_level, 'name' : name >

    Возвращаемое имя пользователя name соответствует указанному турниру contest_id. В результате авторизации уровень привилегий может быть понижен. Например, если был запрошен уровень привилегий ADMIN, а пользователь имеет только уровень привилегий JUDGE, будет установлен уровень привилегий JUDGE и это значение будет возвращено в priv_level.

    privLoginBySID

    Для авторизации с правами администратора по сессионному ключу используется метод privLoginBySID.

    res = clnt.privLoginBySID(ip_str, ssl_flag, contest_id, sid, priv_level)

    Если операция завершилась с ошибкой выбрасывается исключение IOError. Если операция завершилась успешно, то res — это словарь следующего вида:

    < 'user_id' : user_id, 'contest_id' : contest_id, 'locale_id' : locale_id, 'priv_level' : priv_level, 'login' : login, 'name' : name >

    Возвращаемое имя пользователя name соответствует указанному турниру contest_id.

    Как нормально реализовать форму регистрации на Python + Tkinter?

    Пишу форму регистрации на Python3 TKinter. Проблемма в том что есть 2 бага: первое в регистрации при попытке ввести данные получает странную ошибку; второе при авторизации проверка логина проходит успешно, а абсолютно эдентичная проверка пароля ставит систему в тупик. Код ниже

    from tkinter import * from functools import partial from tkinter.messagebox import * import re #текст a="Авторизируйтесь" #Зоглоловок окна b="Вход в приложение"#Текст в приложениии c="Пожайлуста введите данные:"#Текст в приложение 2 d="Вы зарагистрированны?"#Вопрос о регистрации пользовотеля e="Придумайте надежный логин и пароль" f="Регистрация" #Логины namelist = ["ilia"] #Пароли passwdlist= ["2" "1"] window = Tk() window.title(a) text1=Label(text=b) text1.pack(fill=BOTH, expand=True) text2=Label(text=c) text2.pack(fill=BOTH, side=LEFT, expand=True) entryLOGIN = Entry() entryLOGIN.insert(0,"Логин") entryLOGIN.pack(fill=BOTH, side=LEFT, expand=True) entryPASS = Entry() entryPASS.pack(fill=BOTH, side=LEFT, expand=True) entryPASS.insert(0,"Пароль") i=0 #Оценка стойкости пароля def ChekDATA(entryEPASS,entryELOGIN,namelist,passwdlist): passw=entryEPASS.get() name=entryELOGIN.get() fl=0 a=0 while True: if (len(passw)<8): fl=-1 break elif not re.search("[a-z]",passw): fl=-1 break elif not re.search ("[A-Z]",passw): fl=-1 break elif not re.search("[0-9]",passw): fl=-1 break elif re.search("\s",passw): fl=-1 break if fl==0: passwdlist.append(passw) a=a+1 while True: if (len(name)<8): fl=-1 break elif not re.search("[a-z]",name): fl=-1 break elif not re.search ("[A-Z]",name): fl=-1 break elif not re.search("[0-9]",name): fl=-1 break elif re.search("\s",name): fl=-1 break if fl==0: namelist.append(name) a=a+1 if a==2: avt(passwdlist,namelist,a,b,c,d,e,f,window) else: showinfo("Информация","Пароль ненадежн повторите попытку") reg(window) #Приложение регистрации def reg(window): window.destroy() Regw= Tk() Regw.title(f) text1E=Label(text=e) text1E.pack(fill=BOTH, expand=True) text2E=Label(text=c) text2E.pack(fill=BOTH, side=LEFT, expand=True) entryELOGIN = Entry() entryELOGIN.insert(0,"Логин") entryELOGIN.pack(fill=BOTH, side=LEFT, expand=True) entryEPASS = Entry() entryEPASS.pack(fill=BOTH, side=LEFT, expand=True) entryEPASS.insert(0,"Пароль") buttonREG = Button(text="Ввести",command=partial ( ChekDATA, entryPASS, entryLOGIN, namelist, passwdlist )) buttonREG.pack(fill=BOTH, side=BOTTOM, expand=True) def avt(passwdlist,namelist,a,b,c,d,e,f,window): #Приложение авторизации window.destroy() window = Tk() window.title(a) text1=Label(text=b) text1.pack(fill=BOTH, expand=True) text2=Label(text=c) text2.pack(fill=BOTH, side=LEFT, expand=True) entryLOGIN = Entry() entryLOGIN.insert(0,"Логин") entryLOGIN.pack(fill=BOTH, side=LEFT, expand=True) entryPASS = Entry() entryPASS.pack(fill=BOTH, side=LEFT, expand=True) entryPASS.insert(0,"Пароль") i=0 #Функция авторизации и проверки паролей на подлинность def increase(namelist,passwdlist,entryLOGIN,entryPASS,i): p=entryPASS.get() name=entryLOGIN.get() while i<10: if name in namelist: print("имя есть") if p in passwdlist: print(a) window.destroy() main(name) else: entryPASS.delete(0,END) i=+1 else : showerror( "Ошибка","Введен неверный логин" ) enrtyLOGIN.delete(0,END) i=+1 else: showerror( "Ошибка","Попытки кончились" ) buttonVXOD = Button( master=window, text="Войти", command=partial(increase, namelist, passwdlist, entryLOGIN, entryPASS, i ) ) buttonVXOD.pack(fill=BOTH, side=BOTTOM, expand=True) #Вопрос о том зарегистрирован ли пользователь def check(): answer = askyesno( title="Вопрос", message=d ) if answer: avt(passwdlist,namelist,a,b,c,d,e,f,window) else: reg(window) check() window.mainloop()
    • Вопрос задан более двух лет назад
    • 2040 просмотров

    Комментировать
    Решения вопроса 1

    первое в регистрации при попытке ввести данные получает странную ошибку

    Потому что с именами путаница. Например, в reg используются элементы entryEPASS а на проверку передаются entryPASS.

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

    У вас там проверка вообще странная, ищете логин среди всех, затем пароль среди всех, а если совпадают так уходите в бесконечный цикл.
    И вообще, у Вас логины отвязаны от паролей, совпадение покажет даже для несовпадающих пар логин:пароль, даже если они просто есть в данных. Для нормальной проверки нужно хранить их попарно, например в виде словаря logins =
    Правильнее было бы сделать проверку (используя ваши же переменные name, p) и вышеуказанный словарь
    if logins.get(name) == p:
    сразу проверит, что введенные логин и пароль совпадают.

    И саму проверку пароля лучше не привязывать к элементам интерфейса. Сделать функцию, просто принимающую готовые строки (логин, пароль) и выдающую результат проверки. А в эти функции передавать уже строки из нужных элементов интерфейса: entryPASS.get() и т.п.

    Пары — Python: Составные данные

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

    from hexlet_pair import cons, car, cdr # Конструктор pair = cons(8, 7) car(pair) # 8 cdr(pair) # 7 pair2 = cons(3, pair) 

    Устроены они достаточно просто и используют структуру данных, которая называется парой. Пар в самом языке Python не существует, мы их реализовали с помощью отдельной библиотеки, и выше можно увидеть пример того, как они используются. Мы подключаем из библиотеки конструктор cons() и селекторы car() и cdr() . Конструктор создает пару, а селекторы служат для извлечения из пары первого значения (с помощью car() ) и второго значения (с помощью cdr() ). Все достаточно просто и очень похоже на реализацию точек из прошлого урока.

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

    Давайте посмотрим, как представлены наши точки с помощью пар:

    def make_point(x, y): return cons(x, y) def get_x(point): return car(point) def get_y(point): return cdr(point) def to_string(point): return f'(get_x(point)>, get_y(point)>)' 

    Здесь все предельно просто: make_point() — это функция, которая принимает x и y и вызывает конструктор пары с этими аргументами. То же самое с селекторами: get_x() и get_y() принимают на вход точку и вызывают с этой точкой car() и cdr() соответственно.

    Можно заметить, что сработало бы даже такое определение:

    make_point = cons get_x = car get_y = cdr 

    Здесь все верно с синтаксической точки зрения и с точки зрения получения конечного результата. Но с таким способом определения есть некоторые проблемы: по сути, когда мы делаем такое присваивание, получается, что make_point() и cons() являются одним и тем же экземпляром. Кто-то может сказать, что они ссылаются на одну и ту же функцию, но это уже тонкости реализации конкретного языка программирования. На практике это означает, что, запустив построенный таким образом код, вы не увидите вызова функций make_point() , get_x() или get_y() , потому что их фактически не существует. При отладке вы не найдете этих функций в бэктрейсе. Вы можете захотеть увидеть все вызовы, например, make_point() , но вы точно не захотите отслеживать в вашей программе все вызовы cons() , которые могут использоваться не только для точек, а вообще для любых библиотек. Поэтому мы не используем такое определение, но о нем нужно знать, чтобы понимать, как в целом все работает.

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

    point1 = make_point(1, 2) point2 = make_point(10, -2) segment = make_segment(point1, point2) start_segment(segment) # (1, 2) end_segment(segment) # (10, -2) 

    Нам нужно сделать две точки (потому что любой отрезок представлен двумя точками). После этого мы используем конструктор make_segment() и передаем туда наши точки, а с помощью селекторов start_segment() и end_segment() мы получаем точки. Важно, что мы получаем именно точки, потому что это тоже составные данные со своими селекторами, с помощью которых можно получать примитивные значения и производить над ними какие-либо манипуляции при необходимости.

    Открыть доступ

    Курсы программирования для новичков и опытных разработчиков. Начните обучение бесплатно

    • 130 курсов, 2000+ часов теории
    • 1000 практических заданий в браузере
    • 360 000 студентов

    Как проверить, совпадает ли пользовательский ввод со словами в .txt файле

    Проблема в том, что можно ввести слова login и password , проверка будет пройдена и пользователь войдёт в систему. Это нужно для работы в консоли и не будет использовано где-то на сайте. Прошу по возможности подсказать максимально простое решени - я новичок в python'e.

    Отслеживать
    20.2k 6 6 золотых знаков 37 37 серебряных знаков 81 81 бронзовый знак
    задан 24 ноя 2019 в 15:28
    13 3 3 бронзовых знака

    2 ответа 2

    Сортировка: Сброс на вариант по умолчанию

    все дело в том, что вы неправильно храните данные в текстовом файле, делать это лучше словарем:

    тогда при счете файла вы получите такую конструкцию:

    преобразуем в словарь:

    x = ast.literal_eval(x) 

    теперь можно спокойно искать наш логин\пароль в логинах\паролях полученного словаря словарей:

    for dict in x: if input_login and input_password in dict.items(): print('nice') break 

    Отслеживать
    48.9k 17 17 золотых знаков 56 56 серебряных знаков 100 100 бронзовых знаков
    ответ дан 24 ноя 2019 в 16:27
    2,396 11 11 серебряных знаков 32 32 бронзовых знака

    Что значит "неправильно"? Хранение просто в текстовом файле с разделением полей определенным символом - один из возможных вариантов хранения данных. Тем более что тут не нужно хранить какую-то сложную иерархическую структуру. Если говорить про неправильность - то неправильно хранить пароль в открытом виде.

    4 дек 2019 в 11:14

    Вот тут у вас с кавычками проблема: x = '<<'login' : 'admin', 'password' : 'admin'>, . >' . И dict из такой строки просто вызвав x = dict(x) не получится сделать (тем более что это не словарь, а сет из словарей). Нужно либо ast.literal_eval() использовать, или хранить в json вместо dict, и декодировать с помощью json.loads .

    4 дек 2019 в 11:15

    @insolor действительно, со словарем ошибся, я естественно имел в виду ast.literal_eval(), сейчас исправлю, а по поводу хранения, это лишние заморочки, если так хочется делить поля - csv в помощь

    4 дек 2019 в 15:20

    Просто разбор данных, как они представлены в вопросе

    def load_logins(): logins = dict() with open('logins.txt') as logins_file: for line in logins_file: line = line.strip() # Проверяем, что строка не пустая if line: # Сначала разбиваем на части по точке с запятой login, password = line.split(';') # Потом каждую часть разбиваем по двоеточию и берем правую часть # (левую не учитываем, считаем что в строке всегда сначала логин, потом пароль) login = login.split(':')[1] password = password.split(':')[1] # Добавляем пару логин-пароль в словарь logins[login] = password return logins login = input("login: ") password = input("password: ") logins = load_logins() if login in logins and logins[login] == password: print("Вы успешно вошли в систему.") else: print("Неверный логин или пароль.") 

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *