Управление пользователями FTP-сервера.
Класс 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(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()
удаляет пользователя из таблицы виртуальных пользователей.
Пример хранения паролей на FTP-сервере в виде хэшей.
В приведенном ниже примере показано, как хранить пароли в виде односторонних хэшей с использованием алгоритма 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()