Класс pyftpdlib.authorizers.DummyAuthorizer()
модуля pyftpdlib
- это базовый класс авторизатора, подходящий для создания подклассов собственных пользовательских авторизаторов. Этот класс, обрабатывает аутентификацию и разрешения FTP-сервера. Он используется внутри класса FTPHandler
для проверки пароля пользователя, получения домашнего каталога пользователей, проверки разрешений пользователя при возникновении события чтения/записи файловой системы и смены пользователя перед доступом к файловой системе.
Класс pyftpdlib.authorizers.DummyAuthorizer
это независимый от платформы интерфейс для управления "виртуальными" пользователями FTP-сервера. Обычно первое, что нужно сделать, это создать экземпляр этого класса и начать добавлять пользователей ftp:
>>> from pyftpdlib.authorizers import DummyAuthorizer >>> authorizer = DummyAuthorizer() >>> authorizer.add_user('user', 'password', '/home/user', perm='elradfmwMT') >>> authorizer.add_anonymous('/home/nobody')
DummyAuthorizer
.DummyAuthorizer.add_user()
добавляет пользователя,DummyAuthorizer.add_anonymous()
добавляет анонимного пользователя,DummyAuthorizer.override_perm()
переопределяет разрешения для каталога,DummyAuthorizer.validate_authentication()
при ошибочной авторизации вызывает AuthenticationFailed
,DummyAuthorizer.impersonate_user()
изменяет текущего пользователя,DummyAuthorizer.terminate_impersonation()
переключает обратно на исходного пользователя,DummyAuthorizer.remove_user()
удаляет пользователя,DummyAuthorizer.add_user(username, password, homedir, perm="elr", msg_login="Login successful.", msg_quit="Goodbye.")
:Метод DummyAuthorizer.add_user()
добавляет пользователя в таблицу виртуальных пользователей.
Необязательный аргумент perm
- это набор букв, ссылающихся на разрешения пользователя. Каждая буква используется для указания того, что текущему пользователю FTP предоставлены права доступа к следующим конкретным действиям.
При возникновении ошибок, таких как недостаточные разрешения или повторяющиеся имена пользователей поднимается исключение AuthorizerError
.
Разрешения на чтение:
"e"
: изменить каталог (команды CWD, CDUP)"l"
: список файлов (команды LIST, NLST, STAT, MLSD, MLST, SIZE)"r"
: извлечение файла с сервера (команда RETR)Разрешения на чтение:
"a"
: добавить данные в существующий файл (команда APPE)"d"
: удалить файл или каталог (команды DELE, RMD)"f"
: переименовать файл или каталог (команды RNFR, RNTO)"m"
: создать каталог (команда MKD)"w"
: сохранить файл на сервер (команды STOR, STOU)"M"
: изменить режим файла (команда SITE CHMOD)"T"
: изменить время модификации файла (команда SITE MFMT)Для предоставления настраиваемых строк ответа при входе пользователя в систему и выходе из нее можно указать необязательные аргументы msg_login
и msg_quit
.
DummyAuthorizer.add_anonymous(homedir, **kwargs)
:Метод DummyAuthorizer.add_anonymous()
добавляет анонимного пользователя в таблицу виртуальных пользователей. Исключение AuthorizerError возникает при таких условиях ошибки, как недостаточные разрешения, отсутствие домашнего каталога или дублирование анонимных пользователей.
Ключевые аргументы **kwargs
такие же, как и в методе DummyAuthorizer.add_user()
: perm
, msg_login
и msg_quit
. Аргумент perm
- это строка со значением по умолчанию 'elr'
, ссылающаяся на разрешение анонимного пользователя "только для чтения". Использование значения 'w'
приводит к появлению предупреждения RuntimeWarning
.
При возникновении ошибок, таких как недостаточные разрешения, отсутствие домашнего каталога или дублирование анонимных пользователей поднимается исключение AuthorizerError
.
DummyAuthorizer.override_perm(username, directory, perm, recursive=False)
:Метод DummyAuthorizer.override_perm()
переопределяет пользовательские разрешения для данного каталога directory
.
DummyAuthorizer.validate_authentication(username, password, handler)
:Метод DummyAuthorizer.validate_authentication()
вызывает pyftpdlib.authorizers.AuthenticationFailed
, если предоставленные имя пользователя и пароль не соответствуют сохраненным учетным данным.
DummyAuthorizer.impersonate_user(username, password)
:Метод DummyAuthorizer.impersonate_user()
выдает себя за другого пользователя (изменяет текущего пользователя noop
). Метод всегда вызывается перед доступом к файловой системе. По умолчанию ничего не делает.
Ожидается, что подкласс, переопределяющий этот метод, предоставит механизм для изменения текущего пользователя.
DummyAuthorizer.terminate_impersonation(username)
:Метод DummyAuthorizer.terminate_impersonation()
переключает обратно на исходного пользователя (noop
). Метод всегда вызывается после доступа к файловой системе. По умолчанию ничего не делает.
Ожидается, что подкласс, переопределяющий этот метод, предоставит механизм для переключения обратно на исходного пользователя.
DummyAuthorizer.remove_user(username)
:Метод DummyAuthorizer.remove_user()
удаляет пользователя из таблицы виртуальных пользователей.
В приведенном ниже примере показано, как хранить пароли в виде односторонних хэшей с использованием алгоритма SHA1 (hashlib.sha1
).
import os import sys from hashlib import sha1 from pyftpdlib.handlers import FTPHandler from pyftpdlib.servers import FTPServer from pyftpdlib.authorizers import DummyAuthorizer, AuthenticationFailed class DummySHA1Authorizer(DummyAuthorizer): def validate_authentication(self, username, password, handler): hash = sha1(password.encode('utf-8')).hexdigest() try: if self.user_table[username]['pwd'] != hash: raise KeyError except KeyError: raise AuthenticationFailed def main(): # хеш-дайджест из текста пароля hash = sha1('12345'.encode('utf-8')).hexdigest() authorizer = DummySHA1Authorizer() authorizer.add_user('user', hash, os.getcwd(), perm='elradfmwMT') authorizer.add_anonymous(os.getcwd()) handler = FTPHandler handler.authorizer = authorizer server = FTPServer(('', 2121), handler) server.serve_forever() if __name__ == "__main__": main()