|
Простейший случай разрушения системы авторизации -
- стирание учетной записи или забывание пароля - легко решается
при помощи утилиты zpasswd (/usr/sbin/zpasswd). Введите команду :
zpasswd -u admin -p <ПАРОЛЬ> /var/lib/zope/<СЕРВЕР>/inituser
В рабочем каталоге экземпляра сервера будет создан файл inituser с учетной
записью. При следующем старте, сервер прочитает учетную запись и сохранит
ее в корневой папке учетных записей, а файл inituser будет стерт.
Авторизовавшись, следует создать новую учетную запись и стереть учетную запись
пользователя admin.
Сложнее обстоят дела, если была стерта папка учетных
записями в корне сайта (/acl_users) . В этом
случае следует использовать следующий подход :
# Настраиваем среду
% export PYTHONPATH=/usr/lib/zope/lib/python
% export INSTANCE_HOME=/var/lib/zope/<СЕРВЕР>
% cd $INSTANCE_HOME
# Стартуем python
% python
>>> import ZODB
>>> from App.Extensions import getObject
>>> import Globals, ZODB.FileStorage
# Открываем ZODB
>>> Storage=ZODB.FileStorage.FileStorage('var/Data.fs')
>>> database = ZODB.DB( Storage )
>>> connection = database.open()
>>> dbroot = connection.root()
# Создаем папку учетных записей
>>> from AccessControl.User import UserFolder
>>> dbroot['Application']._setObject('acl_users', UserFolder())
# Подтверждаем транзакцию
>>> get_transaction().commit()
[EOF]
Эта последовательность команд создает в корневом объекте Zope папку
пользователей, после чего можно создать пользователя командой zpasswd.
При неисправности внешней системы авторизации ситуация усугубляется
тем, что некоторые UserFolder'ы (например
mysqlUserFolder) блокируют заимствование авторизации и целые разделы сервера
могут стать полностью недоступны. Наилучший способ решить
проблему - это настроить внешнюю систему авторизации или отключить ее
стандартным способом (если она предусматривает таковой, в
случае с mysqlUserFolder можно установить
переменную VALIDATE_ALWAYS_SUPER в файле mysqlUserFolder/cfg.py в
значение "1").
К сожалению, это не всегда возможно : система авторизации может
не поддерживаться в новой среде, вам могут быть неизвестны пароли и
тому подобные вещи. Удалить папку пользователя можно также как и создать
ее : только нужно использовать функцию удаления. Например, что бы удалить
папку пользователей из объекта /QuickStart :
>>> dbroot['Application'].QuickStart.acl_users._delOb()
>>> get_transaction().commit()
При этом может потребоваться импортировать различные продукты, объекты
которых используются на пути к acl_users, поэтому, когда
есть или может быть получена XML-реплика, смелые парни, которым
нечего терять кроме времени, открывают ее VI и вычеркивают
из ObjectManager ссылку на идентификатор acl_users. Те, для кого это
пустой звук, могут попробовать сделать так :
sed -s "s/acl_users/goddamn/g" <входная_реплика.xml >выходная_реплика.xml
После этого объекты acl_users перестанут быть таковыми, вы можете
попробовать импортировать реплику обратно и стереть объекты goddamn.
Еще раз - этот способ для тех, кому нечего терять: остальным лучше так не делать.
|