Мы строим сайты

Наша студия профессионально занимается разработкой веб сайтов, поддержкой, и поисковым продвижением. Мы оказываем комплексные услуги по написанию специфических веб-приложений, дизайну,
3D-моделированию, изготовлению CD-визиток

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

Студиявеб-дизайнаPrime
 
 

Глава 9. Настройка безопасности и работа с пользователями

Вверх на один уровень

Автор перевода Егор Шершнёв

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

Прежде чем перейти к изучению, хотелось бы обратить внимание на следующую интересную цитату:

Безопасность - это сложно.

Jim Fulton, chief Zope architec

Система безопасности Plone является настолько мощной и многогранной, что может быть достаточно сложной в отладке и администрировании. Возможно, никакая другая часть Plone не является такой важной, каковой является раздача прав доступа пользователям. Брешь в системе безопасности, вероятно, самое серьёзное, что может случиться с сайтом. По этой причине материал данного раздела будет представлен в максимальном объёме.

В данной главе прежде всего будет рассмотрена необходимая терминология и ключевые интерфейсы, с помощью которых будут взаимодействовать пользователи. Далее будет рассказано о том, как производится добавление пользователей и групп с иcпользованием интерaейса, который предоставляет Plone. Очередным шагом будет описание ключевых инструментов и API, позволяющих осуществлять управление пользователями и их правами доступа. Далее будет описана возможность изменения пользователей и их свойств, используя Python. В заключительной части главы рассмотрим безопасность сервера и изменение процедуры аутентификации пользователей, которое будет дополнено детальным примером того, как объединить пользователей с LDAP (Lightweight Directory Access Protocol) сервера.

Администрирование пользователей

Одна из наиболее общих задач, которой вам необходимо будет заниматься в качестве администратора Plone сайта это взаимодействие с участниками сайта. Вы можете выполнять некоторое количество несложных задач используя Web, однако, конечно же, лучший друг любого администратора это какой-либо язык сценариев, например Python, который позволяет делать глобальные изменения. Если на вашем сайте достаточно большое количество пользователей, раздел "Сценарии для работы с пользователями" будет вам особенно интересен.

Пользователи, роли и группы

Одними из ключевых понятий в Plone являются пользователи (users), роли (roles) и группы (groups). Прежде чем поговорить об их использовании, рассмотрим более подробно то что они означают.

Пользователи (Users)

Каждый человек, посещающий Plone-сайт относится к его пользователям (user) Пользователь может быть, а может не быть аутентифицированным пользователем сайта. Те пользователи, которые не прошли процедуру аутентификации являются анонимными пользователями (anonymous). Пользователи, которые прошли процедуру аутентификации, находятся на сайте под своей учётной записью. Если пользователь ранее не посещал сайт и не имеет учётной записи, в большинстве случаев он легко может её создать.

Анонимные пользователи имеют самый низкий уровень доступа, вследствие чего для них существует наибольшее число ограничений. После того, как пользователь аутентифицировался, он получает роль, соответствующую его учётной записи. Каждый пользователь имеет собственный короткий идентификатор (имя), например andym. По умолчанию пользователи для Plone-сайта не создаются. Исключение составляет тот, который добавляется в Zope при инсталляции и имеет администраторские полномочия. Имя этого пользователя в большинстве случаев установки - admin.

Роли (Roles)

В Plone-сайте определены несколько ролей. Роль - это логическая категория пользователей. Вместо того, чтобы устанавливать список прав доступа для каждого пользователя, права доступа определяются для каждой роли. Пользователю может не соответствовать никакая роль, а может соответствовать (одна или несколько). Например, пользователь может быть участником (роль member) портала и администратором (роль manager). Каждая роль определяется некоторым именем, например: Member.

Plone-сайт содержит пять заранее определённых ролей, поделенных на 2 группы: назначаемые и неназначаемые. Назначаемыми являются роли, которые вы можете назначить пользователям (назначенные роли будут соответствовать пользователям после прохождения аутентификации). Неназначаемые роли это роли, которые вы не можете раздать пользователям, но которые, однако, имеют место на сайте. Например, вы не назначаете пользователю роль anonymous.

Неназначаемые роли следующие:

Anonymous: это пользователь, который не вошёл на сайт. Это может быть пользователь, у которого нет учётной записи или который просто ещё не аутентифицировался.

Authenticated: данная роль соответствует любому пользователю, который вошёл на сайт независимо от его роли. В соответствии с написанным пользователь может иметь роль anonymous или authenticated, которые являются взаимоисключающими. Поскольку данная роль не обеспечивает необходимой детализации пользователей, в большинстве приложений её использование не рекомендуется.

Назначаемые роли следующие:

Owner: это специальная роль, которая назначается пользователям, когда они создают объект. Роль назначается пользователю только для этого объекта (который он создал), информация о чём хранится внутри объекта. Вам не требуется явно назначать данную роль: Plone сделает это за вас.

Member: эта роль по умолчанию для всех пользователей, которые зарегистрировались на сайте. Все, кто использовл кнопку join (Регистрация), получают данную роль.

Reviewer: это пользователь с бОльшими правами, чем member, но с меньшими, чем manager. Пользователи с ролью Reviewer (рецензенты) могут редактировать или рецензировать содержимое сайта, добавленное пользователями с ролью member. Они также могут изменять конфигурацию сайта и редактировать учётные записи.

Manager: пользователи с данной ролью (администраторы, менеджеры) могут делать с Plone-сайтом практически всё, поэтому данную роль следует назначать только проверенным разработчикам и администраторам. Менеджер может удалять и редактировать содержимое сайта, удалять пользователей, изменять конфигурацию сайта и даже удалять Plone-сайт.

Группы (Groups)

Концепция групп отличается от концепции ролей. Подразумевают то, что пользователи с различными ролями имеют различные права доступа, в то время, как разделение на группы - это логическое упорядочение пользователей. Например подразделение маркетинга может предствалять собой одну группу, подразделение разработчиков - другую. Каждый пользователь может не принадлежать ни к каким группам или принадлежать нескольким группам. Разделение на группы не является обязательным, вследствие чего необходимости в использовании групп нет, однако по мнению разработчиков Plone их использование является весьма полезным.

Разработчики сайта могут использовать группы там, где посчитают это нужным, например для обозначения некоторого подразделения или класса пользователей. Для большинства людей, которые только начинают использовать Plone, рекомендуется оставить существующий набор групп без изменений: по умолчанию группы не определены.

ЗАПОМНИТЕ Работа с группами происходит с использованием Group User Folder (GRUF). Группы не являются частью Zope, а представляют собой дополнительный инструмент Plone. GRUF была разработана Ingeniweb.

Вкладка "Совместный доступ" (Sharing)

Когда в главе 3 говорилось о публикации документов, описание вкладки "Совместный доступ" было пропущено, поскольку это достаточно сложное занятие, которое не всегда хочется выполнять. Вкладка "Совместный доступ" это одно из действий, входящих в инструмент portal_actions, так что если вы не хотите, чтобы данная вкладка отображалась, следует используя ZMI отключить флажок visible, соответствующий данной вкладке. Однако её наличие весьма полезно, поскольку позволяет вам назначать локальные роли объекта для различных пользователей или групп.

Если у вас есть некий объект, который вы хотите поместить на сайт и сделать его доступным для какого-либо определённого посетителя, вы можете назначить необходимые права доступа именно для данного объекта. Это называется локальная роль. Локальная роль позволяет вам устанавливать пользователям расширенные права доступа к объекту. Тот, кто создаёт документ в Plone, становится его владельцем (роль "Owner") и получает определённые права. Если автор документа перед выполнением публикации документа желает сотрудничать с коллегой по имени Ralph, то Ralph'а необходимо наделить большими правами, чтобы он смог редактировать документ. Чтобы выполнить это, необходимо перейти на вкладку "Совместный доступ" (Sharing) и назначить Ralph'у соответствующие права.

ЗАПОМНИТЕ Вы можете назначать локальные роли папкам и документам. В случае установки локальной роли для папки, соответствующая роль будет установлена и для всего её содержимого.

Вкладка "Совместный доступ" появляется только в тех местах, где у вас есть права на изменение прав доступа к объекту. Перейдите в свою папку и нажмите на вкладку "Совместный доступ". соответствующая форма показана на рисунке 9-1. Она состоит из трёх основных компонентов: вы можете назначить локальную роль для данного объекта, вы можете назначить группу, которая будет иметь локальную роль для данного объекта и вы можете увидеть список пользователей, роли для которых уже установлены.

0901.png
Рисунок 9-1. Вкладка "Совместный доступ"

Чтобы найти пользователя для назначения ему необходимой роли введите ключевое слово поиска (например gavin) и выполните поиск. В результате на экран будет выведен список пользователей, соответствующих заданным критериям поиска. Для назначения пользователю некоторой локальной роли её следует выбрать из выпадающего списка. Например, на рисунке 9-2 пользователю с ником gavin для некоторой папки назначается роль owner.

0902.png
Рисунок 9-2. Назначение роли пользователю

В рассмотренном примере речь шла о назначении прав доступа конкретному пользователю, однако данные действия можно проводить и для большего числа пользователей в том случае, если для них назначены группы. Если есть необходимость позволить редактировать некоторый документ всем представителям команды маркетинга, это можно сделать достаточно легко. Для просмотра существующих групп в случае отсутствия информации о них необходимо нажать View groups, в результате чего станет доступен список групп, определённых на сайте. После этого вы легко можете назначить локальную роль группе. На рисунке 9-3 для заданной папки группе Development назначается роль owner.

0903.png
Рисунок 9-3. Назначение роли группе пользователей

В заключение, на рисунке 9-4, вы можете увидеть каким пользователям и группам предоставленны локальные роли для данной страницы и удалить данные роли в случае необходимости. С того момента, как вы назначаете кому-либо локальные роли, вы тем самым предоставляете возможность пользоваться вкладкой "Совместный доступ" (Sharing). Теперь ничто не помешает им удалить вашу роль для данного объекта.

0904.png
Рисунок 9-4. Просмотр и удаление ролей

Администрирование через Web

Используя интрфейс Plone, вы легко можете изменить принадлежность какого-либо пользователя к группе, изменить информацию о пользователе, добавить группы и т.п. Большинство из этих действий выполняются через панель управления Plone: нажмите "установки plone" (plone setup), выберите "Администрирование пользователей и групп" (Users and Groups Administration). Вы увидите две вкладки: Пользователи (Users) и Группы (Groups)

На вкладке "Пользователи" находится список пользователей системы. Представленная на вкладке форма является интуитивно понятной: вы можете удалить пользователя, сбросить его пароль (в этом случае пароль отсылается пользователю) или изменить адрес электронной почты пользователя, как показано на рисунке 9-5.
0905.png
Рисунок 9-5. Редактирование пользователей

Нажатие на нике пользователя вызывает форму настроек свойств этого пользователя, сделать необходимые изменения и нажать "сохранить" (Save). Для добавления нового пользователя следует нажать кнопку добавить нового пользователя (add new user), что приведёт к открытию формы регистрации пользователя и позволит задать данные о нём. Из-за того, что число пользователей сайта может стать достаточно большим, данные о них будут сгруппированы в соответствии с привычными методами Plone. Вы можете производить поиск пользователей по адресу электронной почты или имени.

Вы можете добавлять, редактировать и удалять группы пользователей перейдя на вкладку "Группы" (Groups). Чтобы добавить группу, нажмите кнопку "Добавить новую группу" (add new group): единственное поле, обязательное для заполнения - это название (имя) группы (Title), которое желательно делать коротким и описывающим группу. Обычно группы непосредственно соответствуют деловой деятельности или деятельности на сайте.

Теперь, когда группы созданы и существуют несколько пользователей, вы можете производить сопоставление пользователей и групп. Это можно делать с использванием панели управления Plone (plone control panel). Вы можете кликнуть на пользователя и занести его в некоторую группу, либо нажать на группу и добавить в неё необходимых пользователей.

Когда следует использовать группы?

Использование групп не является обязательным и вы можете никогда не использовать их. Однако, одно из преимуществ использования групп заключается в возможности создания рабочих пространств (workspace). В базовом Plone-сайте пользователи могут добавлять и редактировать контент только в их собственных папках. Владельцем каждой единицы контента в подобной папке является тот человек, который данный объект создал. Это не очень хорошо. Естественной может стать необходимость предоставить доступ к даному контенту некоторым другим пользователям.

Это та самая ситуация, когда осознаётся необходимость использования рабочих пространств (рабочих областей). Подобно папке members, которая содержит персональные папки всех пользователей системы, существует папка, называемая GroupWorkspaces. Она создаётся по умолчанию всегда, когда добавляется какая-либо группа. Таким образом, если вы добавите группу с именем Marketing, вы сможете обнаружить папку GroupWorkspaces/Marketing. Любой пользователь из группы Marketing будет иметь права на добавление, редактирование и удаление контента в рабочем пространстве Marketing. Другими словами, после добавления группы у вас появляется персональная папка для этой группы. Того же самого можно было бы добиться, создав группу и установив для некоторой папки необходимую локальную роль для данной группы.

Это только один пример полезности использования групп. Другой пример - рабочие циклы (workflow). В предыдущей главе было рассказано о рабочих циклах и о том, как разослать сообщения определённым людям в случае необходимости. Если, например, какой-либо представитель группы маркетинга добавил некоторый документ, вы можете разослать почтовые сообщения об этом всем представителям данной группы, а не просто кому-либо. В разделе "Подсчёт пользователей в группе" будет рассказано о том, как это сделать.

На web-сайте Plone, например, пользователи разделены на группы, отвечающие за разработку (development - отвечает за функциональность сайта и выпуск новых версий) и документацию (documentation - отвечает за документацию).

Администрирование групп

Используя панель управления вы можете администрировать группы двумя различными способами. Вы можете выбрать пользователя и перейти к группам данного пользователя или выбрать группц и перейти к пользователям данной группы. Оба способа позволяют легко добавлять и удалять группы, в состав которых входит пользователь. Однако, для добавления пользователя в группу необходимо перейти на страницу поиска пользователей, выбрать пользователя и перейти на вкладку "членства группы", на которой будет отображены группы для данного пользователя. Например, на рисунке 9-6 показаны группы для пользователя andym.

0906.png
Рисунок 9-6. Группы для заданного пользователя

Для добавления пользователя в новую группу, выберите соответствующий группе флажок (checkbox) и нажмите добавить пользователя в выбранные группы add user to selected groups.

Подобным образом вы можете удалить пользователя из группы выбором необходимого флажка и нажатием кнопки удалить выбранные группы (remove selected groups). Подобный интерфейс вы увидите, если перейдёте в панель управления в раздел администрирование пользователей и групп (User and Groups Administration) и выберите вкладку группы (Groups). Нажмите на группу и перейдите на вкадку члены группы (group members). Вы увидите список пользователей данной группы, которых можно удалять и добавлять.

Назначение ролей группам

Роли могут быть назначены не только пользователям, но и группам. Это может показаться для вас немного странным, однако подумайте, например о группе supervisors, которой необходима возможность работать с контентом, добавленным одним из участников группы staff. Для предоставления подобной возможности группе supervisors необходимо предоставить роль reviewer. Для работы с группой supervisors необходимо нажать установки Plone (Plone setup), выбрать управление пользователями и группами (User and Groups Administration), перейти на вкладку группы (groups), нажать добавить новую группу (add new group), присвоить этой группе имя Supervisors и сохранить изменения. На следующей форме вы увидите список групп и ролей, назначенных для них. Для назначения роли reviewer данной группе, выберите соответствующий флажок, отвечвющий за роль reviewer, как показано на рисунке 9-7.

0907.png
Рисунок 9-7. Назначение роли reviewer для группы Supervisors

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

Идея о группах, имеющих роли, в настоящий момент немного изменённая парадигма Zope, поскольку по его сценарию роли должны использоваться для конкретного пользователя. Естественно, вы можете делать то же самое в Plone, однако помните, что при необходимости можно легко работать и с группами тоже.

ЗАПОМНИТЕ В соответствии с написанным, когда для объекта устанавливают права доступа, необходимо принимать во внимание некоторые факторы. Во-первых, следует определить роли, назначенные для пользователя. Во-вторых, следует определить роли, которые пользователь наследовал от группы. Только учёт обоих факторов позволит получить полную картину того, какую роль будет иметь пользователь внутри объекта.

Инструменты регистрации пользователей

Прежде чем пользователи становятся участниками сайта, они должны пройти процедуру регистрации. Пользователи могут легко зарегистрироваться, нажав на сслыку join в правом верхнем углу Plone-сайта. Данная процедура была детально описана в главе 3. Регистрация пользователей на сайте достаточно проста, однако существует некоторое количество опций. Процесс регистрации контролируется тремя ключевыми инструментами: portal_registration, portal_memberdata и portal_membership. Рассмотрим работу каждого из инструментов.

Portal Registration

Инструмент portal_registration контролирует только одно ключевой действие в Plone: регистрацию. Нажатие на данной ссылке (join) откроет необходимую форму. По умолчанию любой пользователь, включая анонимного, который ещё не вошёл на сайт, может регистрироваться.

При регистрации с использованием соответствующей формы, пользователи могут ощутить на себе одну из простых опций Plone-сайта: проверять достоверность e-mail или не проверять. Единственный достоверный способ проверки указанного почтового адреса - отослать по нему письмо и посмотреть, придёт необходимый ответ или нет. По умолчанию, проверка корректности адреса отключена: это значит, что при регистрации пользователю необходимо указать имя, почтовый адрес и пароль. В этом случае пользователи смогут входить на сайт как обычно - это форма, о которой говорилось в главе 3. Если проверка почтового адреса включена, пользователи при регистрации задают только пароль, имя пользователя и электронный почтовый адрес, как показано на рисунке 9-8.

0908.png
Рисунок 9-8. Регистрация пользователя с включенной проверкой почтового ящика

После подтверждения введённых данных пользователю отсылается имя пользователя и пароль. С этого момента вход на сайт не будет отличаться от других пользователей.

Для включения проверки подлинности электронного адреса, нажмите установки Plone (Plone setup) и выберите пункт установки портала (Portal Settings). В разделе политика пароля (Password settings) выберите Сгенерировать и отправить по электронной почте начальный пароль участника (Generate and e-mail members' initial password) и сохраните сделанные изменения.

Если вы хотите посмотреть или редактировать письмо, получаемое пользователем, вам необходимо отредактировать соответствующий шаблон, который данное письмо генерирует. Вы можете его найти перейдя в plone_skins, plone_templates и выбрав registered_notify_template.

Если вы хотите добавить любые другие действия для пользователей, прежде чем они присоединятся к сайту, это лучшее место сделать задуманное. Например, если вы хотите добавить страницу, которая отображает политику безопасности, самое время это сделать. Чтобы сделать изменения, прежде всего добавьте страницу и всю информацию, которую вы хотите поместить. Было бы здорово, если бы идентификатор страницы содержал полезную информацию о ней, например privacy.html (файл поместим в корень Plone-сайта).

Перейдите в ZMI в portal_registration и обавьте действие со следующей информацией:

Name: Privacy
Id: privacy
Action: string: ${portal_url}/privacy.html
Condition: not: member
Permission: Add portal member
Category: user
Visible: selected

Теперь у вас есть ссылка на страничку с вашей политикой безопасности в том случае, если вы не вошли в систему. Указав категорию user вы обеспечили её появление в персональной панели (рядом с join).

Данные об участниках портала

Инструмент portal_memberdata хранит данные о каждом из пользователей. Пользователи Plone имеют набор свойств, таких как скины, время последнего входа, WYSIWYG редактор и т.п. В момент регистрации пользователя каждому из данных свойств назначаются значения по умолчанию. Фактические записи создаются с помощью добавления записей в portal_memberdata. Нажмите на portal_memberdata и перейдите на вкладку properties, чтобы увидеть свойства, устанавливаемые по умолчанию. В Plone эти свойства следующие:

  • e-mail: это адрес электронной почты пользователя
  • portal_skin: это ненужное свойство: игнорируйте его
  • listed: Показывает данного пользователя в папке Members (Boolean). По умолчанию свойство установлено (True)
  • login_time: это дата входа пользователя в систему в текущей сессии
  • last_login_time: дата последнего входа пользователя на сайт
  • fullname: это полное имя пользователя
  • error_log_update: свойство, используемое формой сообщений об ошибках, игнорируйте данное свойство.
  • formtooltips: в старых версиях Plone существовали опции для отображения помощи. Сейчас данное свойство не актуально, так что игнорируйте его.
  • visible_ids: Свойство отвечает за отображение идентификаторов объектов. При его включении первое поле в форме редактирования для любого типа контента будет Name (имя), изменяя которое пользователи могут переименовывать объект. По умолчанию свойство включено.
  • wysiwyg_editor: Это редактор, используемый в формах

Вы можете добавлять или удалять данные свойства используя ZMI. Однако добавление или удаление элементов подобным образом не перестраивает интерфейс, в котором указанные свойства редактирует пользователь. В главе 3 вы видели, что нажимая на мои настройки(my preferences) пользователь получает доступ к изменению большинства указанных свойств. Если вы хотите изменять данные свойства, вы должны настроить соответствующую форму. Значения, присваиваемые данным полям - это значения по умолчанию для вновь зарегистрированных пользователей. Например, по умолчанию все пользователи отображаются при переходе на вкладку участники (members), за исключением тех, для кого явно указано обратное.

Так, например, если вы хотите, чтобы все пользователи по умолчанию не отражались в результатах поиска, вы должны изменить установки данной формы. В форме portal_memberdata найдите свойство listed и уберите флажок напротив данного свойства, после чего сохраните изменения. Для всех вновь зарегистрированных пользователей свойство selected будет отключено.

Инструмент portal_groupdata содержит соответствующие данные для групп. Для группы свойства по умолчанию следующие:

  • title: имя группы
  • description: описание группы
  • email: почтовый адрес группы
  • listed: вносить ли группу в список пользователей

Указанные инструменты хранят данные о пользователя и группах вне папки acl_users. Если существует необходимость перемещать информацию о пользователях между серверами, необходимо перемещать данные инструменты: простого перемещения acl_users недостаточно. Указанные действия можно выполнить импортируя и экспортируя необходимые объекты. Учтите, что перед импортированием инструментов существующие следует удалить, иначе возникнет исключительная ситуация.

Принаждлежность к порталу

Инструмент portal_membership содержит немного больше свойств. В частности, он сопоставляет данные о пользователях с конкретными пользователями. Переход к portal_membership из ZMI показывает существенный набор свойств. Далее указаны некоторые из них:

  • Set members folder: Это та папка, в которую помещаются папки участников портала. Папка должна существовать.По умолчанию это папка members
  • Control creation of members areas: По умолчанию персональная папка для каждого пользователя создаётся в тот момент, когда он присоединяется к сайту. Однако, создание данной папки не является обязательным. Для отключения создания персональных папок пользователей снимите флажок Turn folder creation. По умолчанию флажок включен.

Во вкладке Actions вы найдёте полный набор действий, которые выполняются для пользователя когда он вошёл на сайт, такие как my favorites, my preferences и т.п. Все данные действия относятся к категории user, вследствие чего появляются в правом верхнем углу.

Интсрумент portal_groups обеспечивает свойства, подобные portal_membership, но относящиеся к группам. Более того, когда создаётся группа, также создаётся рабочее пространство этой группы доступное для добавления и редактирования контента всем её представителям.

Полезные API

Инструмент portal_membership имеет один из наиболее обшеиспользуемых наборов API функций. Вы будете часто хотеть выяснить ключевую информацию, такую как имя текущего зарегитрированного пользователя, является ли пользователь анонимным и т.п. Данными методами вас обеспечит инструмент portal_membership. Далее следуют наиболее важные его функции:

  • isAnonymousUser(): возвращает true, если пользователь анонимный
  • getAuthenticatedMember(): функция возвращает находящегося в данный момент на сайте аутентифицированного пользователя с некоторым набором свойств из portal_metadata. Если пользователь не вошёл на сайт, функция возвращает специальное имя nobody с нулевыми (null) значениями свойств portal_metadata.
  • listMemberIds(): возвращает идентификаторы всех пользователей сайта.
  • listMembers(): возвращает все объекты пользователей (то есть пользователей, но в виде объектов).
  • getMemberById(id): возвращает объект пользователя по заданному идентиикатору.
  • getHomeFolder(id=None): функция возвращает домашнюю (персональную) папку для пользователя по заданному идентификатору. Параметр ID не является обязательным и в случае его отсутствия будет возвращена домашняя папка текущего пользователя.
  • getHomeUrl(id=none): возвращает URL персональной папки пользователя. Параметр ID не является обязательным и в случае его отсутствия будет возвращён URL домашней папки текущего пользователя.

Информация о пользователе, возвращаемая указанными функциями содержит данные, находящиеся в portal_memberdata так, что свойства являются атрибутами возвращённого объекта. В качестве примера приведём маленький Script (Python), который получает почтовый адрес пользователя c идентификатором andy.

##parameters=
u = context.portal_membership.getMemberById("andy")
return u.email

Аутентификация с ипользованием Cookie

По умолчанию для аутентификации собственных пользователей Plone использует cookie, что означает необходимость их включения в браузере пользователя при входе на сайт. Подобная процедура аутентификации обеспечивается на Plone-сайте с использованием объекта cookie_authentication, который включает в себя всю необходимую фукнкциональность для проведения процедуры аутентификации пользователей. Если вы желаете использовать для аутентификации HTTP протокол, вы можете просто удалить данный объект, однако, делать это не рекомендуется, поскольку для большинства сайтов использование HTTP аутентификации не является хорошей идеей.

Указанный объект имеет следующие свойства, которые вы можете редактировать через ZMI:

  • Authentication cookie name: это имя cookie, которое будет использоваться для поддержания аутентификации. Поддержка достигается за счёт сопоставления пользователю некоторого маркера (token), который защищает логин пользователя. По умолчанию значение поля равно __ac.
  • User name form variable: это имя переменной той формы, в которой будет осуществляться ввод имени пользователя. По умолчанию это __ac_name.
  • User password form variable: это имя переменной в форме регистрации, которая будет содержать пароль. По умолчанию это __ac_password.
  • User name persistence form variable: это имя переменной, которая будет содержать сопоставленный пользователю маркер. По умолчанию это __ac_persistent.
  • Login page ID: Если пользователю необходимо войти на сайт, это та самая страница, которая будет послана ему для заполнения. Значение по умолчанию require_login.
  • Logout page ID: если пользователь вышел из системы, ему будет послана страница с сообщением об этом. Данное свойство - идентификатор этой страницы. По умолчанию он равен logged_out.
  • Failed authorization page ID: это та страница, которая будет показана в случае неуспешной авторизации. По умолчанию значение данному свойству не сопоставлено, поскольку при неуспешной попытке авторизоваться Plone выполняет некоторые свои действия.
  • Use cookie paths to limit scope: свойство используется для установки действия cookie на какую-либо отдельную папку и все её дочерние папки. Оставьте данное поле пустым, как оно есть по умолчанию, чтобы аутентификация распространяла своё действие на весь сайт, независимо от того в какой его части вы вызвали процедуру авторизации.

Чтобы изменить используемые cookie, просто измените значения свойств объекта на вкладке properties и нажмите Save Changes. При этом учтите, что все существующие на компьютере cookie будут игнорироваться и для входа на сайт потребуется повторное указание имени пользователя и пароля. Если вы хотите изменить страницу регистрации, вы можете либо настроить шаблон require_login, либо изменить значение соответствующей переменной.

User Folder

Получить доступ к папке, фактически хранящей информацию о пользователях, можно с помощью нажатия на acl_users в ZMI. Это действие откроет Group User Folder (GRUF) интерфейс, который предоставляет ряд опций.

На самом деле GRUF интерфейс весьма похож на опции при работе с пользователями через панель управления Plone. Вы можете добавлять и редактировать список пользователей и групп используя интуитивно понятный интерфейс. Нажатие на вкладках Users и Groups позволит вам редактировать соответственно, пользователей либо группы. Нажатие на вкладке Content, предоставит возможность выбора между пользователями и группами. Нажмите Users, после чего нажмите acl_users. В результате вы попадёте в фактическую папку acl_users, которая выглядит так же, как и стандартная пользовательская папка. В ней вы увидите список пользователей, нажатие на любом из которых приведёт к его редактированию, как показано на рисунке 9-9.

0909.png
Рисунок 9-9. Редактирование пользователей

Находясь в данном окне вы можете изменять пароль пользователя и назначенную ему роль.

Установка прав доступа

До настоящего момента мы обсуждали пользователей, роли и группы, однако есть нечто большее: самый низкий уровень настроек безопасности - это права доступа (permission). Как предполагает название, назначение пользователю прав означает для него возможность что-либо делать, например просматривать объект, добавлять документ, просматривать содержимое папки и т.д. Каждое право доступа определяется уникальным многозначительным именем, например View, Add portal content, List folder contents.

Права доступа применяются не к отдельным пользователям, а к ролям. Каждая роль имеет свои собственные права доступа, которые переносятся на пользователей с данной ролью. Все свойства прав доступа можно найти через ZMI на вкладке Security. Объекты, для которых можно установит права, включают в себя Plone-сайт, корень Zope, все объекты и содержимое внутри Plone-сайта и скины. После перехода на кладку Security вы увидите все существующие права доступа и роли, оформленные в виде сетки (таблиц), как показано на рисунке 9-10.

0910.png
Рисунок 9-10. Параметры безопасности

На рисунке 9-10 вы можете увидеть, что данный объект имеет набор установок безопасности. Свойства отражаются в виде набора упорядоченных флажков. В левом столбце указываются права доступа в алфавитном порядке, а в верхней строке указываются существующие роли, также в алфавитном порядке. Данная страница является весьма большой и громоздкой, вследствие чего предусмотрены две полезных возможности её использования. Нажмите на какое-либо право доступа, чтобы увидеть все роли, обладающие этим правом. Например, на рисунке 9-11 показываются установки для Access future portal content.

0911.png
Рисунок 9-11. Настройки для права доступа.

Кроме того, вы можете нажать на интересующую вас роль, в результате чего будут в удобном виде показаны все установки для данной роли: смотрите рисунок 9-12.

0912.png
Рисунок 9-12. Настройки для роли rewiever

Для всех указанных прав доступа наиболее простые способы использования - отметка необходимых флажков или выбор опций в списке прав доступа. В случае, если отмечен флажок Acquire Permission setting, установки безопасности для данного свойства будут наследоваться. В случае отключенности флажков наследования не произойдёт. Наследование (acquisition, заимствование) - это свойство объекта производить поиск в объектной иерархии, находить принадлежащие ролям права доступа и объединять их для установка окончательных прав доступа объекта.

ЗАПОМНИТЕ: права доступа будут включены для пользователя с ролью manager, то есть для вас. Блокировка данных свойств - плохая идея, поэтому было бы очень хорошо оставить данные настройки прав доступа неизменными.

Теперь давайте посмотрим на разрешение (право доступа) Access content information. Используя ZMI, перейдите в корневую папку Plone-сайта на вкладку Security. По умолчанию никаких флажков для данного свойства не отмечено, однако включен флажок Acquire Settings option. Это означает, что для определения прав доступа к данному объекту вы должны просмотреть родительские. Перейдите в корневую папку Zope на вкладку Security. Естественно, что корневой папке системы неоткуда наследовать права доступа, поэтому джля неё они указаны явно. Если вы посмотрите на Access content information, то вы увидите отмеченный у данного права доступа флажок для ролей manager и anonymous.

Поскольку права доступа наследуются, все подпапки корневой папки будут также наследовать указанные права доступа. Это означает, что Plone-сайт и все его объекты будут иметь права доступа родительских объектов. Следовательно, если вы хотите установить права доступа для некоторого сайта, всё, что вы должны сделать - это сконфигурировать должным образом права доступа к корневой папке сайта, которые будут распространены на большинство его объектов.

ЗАПОМНИТЕ: исключением являются объекты, задействованные в рабочих циклах, для которых наследование принудительно отключено. Об этом подробно говорится далее в разделе 'Безопасность и рабочие циклы'.

Вы можете настроить права доступа к любому объекту Zope через ZMI: это может быть корневая папка Zope, Plone-сайт, папка Members или любоая единица контента. Каждый объект имеет свои собственные права доступа, однако набор прав для различных объектов может различаться. Например, права типа Add... существуют у всех папок, однако для других объектов (не папок) их может не быть (объект по определению должен быть папкой, чтобы в него можно было что-то добавить).

Любой продукт или кусок Python-кода на Zope-сайте может определять свои собственные права доступа, немного отличные от предоставленных, чтобы точно определить право пользователя что-то делать. Некоторые ключевые права с их описанием перечислены ниже.

  • Access contents information. Позволяет получить доступ к объекту без необходимости его просмотра. Например, пользователь может захотеть увидеть заголовок объекта в результатах поиска, даже если не имеет прав на его просмотр.
  • Add. Существует достаточно много подобных прав, какждое из которых относится к некоторому типу объектов, которые пользователь может захотеть добавить. Для Plone-сайта все права доступа сгруппированы вместе и называются Add portal content.
  • Add Portal Member. Предоставляет возможность регистрироваться на сайте и получать учётную запись пользователя.
  • Copy or Move. Предоставляет право копировать или перемещать объект. Несмотря на то, что пользователи могут иметь данное право, им необходимо также право на вставку объекта в место назначения.
  • Delete objects. Предоставляет право удалять объект. В стандартном Zope, данное право устанавливают для папки. На Plone-сайте оно существует для каждого объекта.
  • List folder contents. Позволяет увидеть содержимое папки. Не отмечается в том случае, если у вас есть права на просмотр содержимого объекта.
  • List portal members. Право на просмотр списка участников портала, а также поиск участников.
  • Modify portal content. Это собирательное разрешение для любых изменений объекта, таких как изменение его содержимого, ключевых слов и других свойств. Данное право существует практически у всех объектов.
  • Set own password. Право на изменение собственного пароля.
  • Set own properties. Право на изменение личных настроек.
  • View. Позволяет пользователю видеть объект. Видеть означает не только просмотр результирующего HTML, но и доступ по FTP, WebDAV и другим протоколам.

Добавление роли

Разделение пользователей по ролям означает, что вы можете найти совместный набор прав доступа для каждой роли таким образом, чтобы использование ролей было максимально эффективно. Это не всегда возможно. Иногда некоторому пользователю может потребоваться нечто отличающееся от представителей его группы.

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

Для добавления роли перейдите на вкладку Security в корневой папке Plone и прокрутите экран до его нижней часть (низ далеко!). Внизу страницы есть маленькая простая форма для добавления ролей и их удаления. Укажите имя желаемой роли и нажмите Add Role

Выполнение общих задач

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

Прекращение регистрации пользователей на сайте

Присоединение к сайту (возможность регистрации на сайте) осуществляется благодаря наличию отмеченного флажка Add portal member в корне Zope. Чтобы прекратить регистрацию пользователей, необходимо отключить данный флажок в корне Zope (регистрация будет невозможна на всех имеющихся Plone-сайтах) либо снять флажок Acquire Permission setting непосредственно у того сайта, на котором необходимо пресечь возможность регистрации (возможность регистрации на других сайтах будет сохранена).

Прекращение возможности поиска по сайту

Опция Search ZCatalog, установленная для анонимного пользователя в корне Plone-сайта позволяет производить поиск по сайту любым его посетителям. Изменить это можно отключив соответствующий флажок для Anonymous'a или любой другой роли.

Прекращение возможности попадания на сайт анонимным пользователям

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

Безопасность и рабочие циклы

Как говорилось в главе 7, workflow управляет безопасностью каждого объекта в некотором цикле. Это происходит путём изменения фактических прав доступа к объекту. Только что было рассказано о том, как посмотреть установки безопасности для каждого объекта, благодаря чему вы можете определить чем отличаются права доступа к оъекту в одном его состоянии от прав доступа к объекту в другом. Если вы перейдёте в инструмент portal_workflow, выберите вкладку Contents, перейдёте в plone_workflow и выберите вкладку States, вы увидите все доступные состояния объекта. Нажмите на какое-либо состояние, перейдите на вкладку Permisiions, в результате чего вы увидите права доступа для данного состояния, как показано на рисунке 9-13.

0913.png
Рисунок 9-13. Права доступа для состояния published

Как вы видите, когда объект переходит в состояние published (опубликованный), анонимному пользователю разрешается получить доступ к данному объекту (Access contents information) и увидеть его (View). Учтите, что участники сайта или владельцы объектов не могут редактировать их, потому что не имеют разрешения на это. Права доступа устанавливаемые рабочими циклами отображаются на вкладке Permissions. Именно там вы можете установить те права доступа, которые будут применяться для данного состояния объекта.

После изменения установок безопасности необходимо перейти в инструмент plone_workflow и нажать Update security settings. В противном случае установки безопасности объекта и workflow будут отличаться.

ЗАПОМНИТЕ: поскольку при установке переходного состояния объекта изменяются права доступа к нему, любые изменения прав доступа к объекту, выполненные через ZMI удаляются в случае перехода объекта в некоторое состояние рабочего цикла. По этой причине вы должны стараться проделывать все изменения настроек безопасности объектов Plone используя workflow.

Ограничения

У каждого перехода (объекта из одного состояния в другое) существуют свои ограничения, которые позволяют администратору указывать права доступа, разрешающие пользователю выполить необходимый переход. В момент проверки может ли пользователь осуществить переход, установки системы проверяются в следующем порядке: проверка прав доступа, проверка роли, после чего происходит проверка выражения (содержащего условия перехода). Если все проверки пройдены, переход объекта в новое состояние будет осуществлён.

Далее перечислены все возможности установки ограничений:

  • Permissions (права доступа): Это список всех доступных прав доступа, разделённых точкой с запятой (;), например: Review portal content; Modify portal content.
  • Roles (роли): это список ролей, разделённых многоточием, которые вправе выполнять переход, например: Manager; Reviewer.
  • Expression (выражение): это TALES выражение для рабочего цикла, которое позволит вам установить необходимое условие. Например, указанный наже переход выполнится только в папке с именем Members. На самом деле это не совсем установка права доступа, а скоррее изящная хотрость:
python: if 'Members' in state_object.getPhysicalPath()

**NOTE**       *getPhysicalPath* is a method of all objects in Zope that returns the location inside the Zope object hierarchy, ignoring any virtual hosting that may occur.

Proxy Roles

В предыдущей главе обсуждались несколько хитрых методов уведомления пользователей и перемещения контента в случае его задействованности в рабочих циклах. При использовании указанных методов выполняется некоторый сценарий, дублирующий действия пользователя, выполняющего определённую операцию операцию. Сценарий может делать то, что могут и что не могут делать пользователи. например, вы можете захотеть разрешить пользователю добавить что-либо в папку с именем public, исключая зависимость от workflow. Это проблема. Вам необходимо гарантировать выполнение сценария выделением пользователю с более "высокой" роли.

Proxy role это нечто такое, с чем пользователи не будут взаимодействать и не будут знать об этом, но для вас это метод решения обозначенной проблемы. Например, вы хотите чтобы участники сайта могли просматривать список пользователей, зарегистрированных на сайте. При этом вы не хотите предоставлять право просмотра всех участников сайта, а лишь пользователей в некотором ограниченом контексте. Для выполнения сценария пользователю будет необходимо установить право доступа List portal members, но вы не хотите давать подобное право пользователям с ролью anonymous.

Сценарий, который позволит решить обозначенную проблему, необходимо запускать из-под более высокой роли, возможно Member. Чтобы сделать это, в ZMI перейдите к сценарию на вкладку Proxy и нажмите Member. Если сценарий (скрипт) расположен в файловой системе, информация будет добавлена в файл метаданных. Например, файл .metadata будет содержать следующую линию: proxy = Member. Теперь сценарий будет исполняться от имени пользователя с ролью Member, решая тем самым поставленную проблему.

Сценарии для работы с пользователями

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

Массовая регистрация пользователей

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

В данный момент мы рассмотрим набор пользователей в фале, разделённом знаками точка с запятой, со следующим содержимым: имя пользователя (ник), полное имя, e-mail и группы. В данном примере вы продвигаетесь по списку, добавляя каждого пользователя и изменяя его свойства так, чтобы они были корректными. Файл с расширением .csv в данном случае будет выглядеть примерно так:

"User Name", "Full Name", "Email", "Groups"
"Andy", "Andy Mckay", "andy@enfoldsystems.com", "Systems,Sales,Development"
...

Файл .csv содержит значения, разделённые ;. Он может быть создан в большинстве программ, представляющих собой электронные таблицы, таких как Microsoft Excel or OpenOffice.org. Вы можете экспортировать данный файл и импортировать его в Plone. Поскольку выполнение подобных действий требуют специфического набора методов, файл необходимо выполнить как external method:

# An external method to import user
import csv
 
# the full path to your csv file
fileName = "/var/zope.zeo/Extensions/test.csv"
 
def importUsers(self):
    reader = csv.reader(open(fileName, "r"))
    pr = self.portal_registration
    pg = self.portal_groups
    out = []
 
    # if your csv file contains a header line that
    # explains the contents of each column
    ignoreLine = 1

Это просто код установки. Другими словами, он устанавливает все переменные, которые вы будете использовать в данном сценарии. В начале вы импортируете csv модуль, который поставляется с Python 2.3 и обеспечивает быстрый разбор .csv файлов. Файл .csv это имя переменой fileName, которая представляет собой полный путь к файлу. Если вы укажете относительный путь, plone может закончить его поиск в неправильном месте. Как вы видели ранее, self - передаётся всякому методу и в даном случае позволяет обратиться к двум необходимым инструментам: portal_registration для доступа к регистрациионным API и portal_groups, который обеспечивает доступ к API для работы с группами:

for row in reader:
    if ignoreLine:
        ignoreLine = 0
        continue

    # check we have exactly 4 items
    assert len(row) == 4
    id, name, email, groups = row
    groups = groups.split(',')

    # make a password
    password = pr.generatePassword()

Теперь необходим цикл по каждой из ячеек для получения значений ID, name, e-mail и groups. После считывания всех параметров необходимо сгенерировать произвольный пароль с помощью вызова метода generatePassword, в результате чего будет получен шестисимвольный пароль, состоящий из букв верхнего и нижнего регистров, а также цифр. Если бы вы хотели заносить в базу ID, сгенерированный пароль, e-mail или что-то ещё, сейчас самое время сделать это. В данном случае принадлежность к группам отмечалась в одном поле с разделением запятыми (например: "Sales,Marketing"). Следовательно, данные значения необходимо разбить на список отдельных имён примерно так:

    try:
        # add in member
        pr.addMember(id = id,
            password = password,
            roles = ["Member",],
            properties = {
                'fullname': name,
                'username': id,
                'email': email,
                }
            )
        # groups are separated by commas
        for groupId in groups:
            group = pg.getGroupById(groupId)
            group.addMember(id)

        out.append("Added user %s" % id)

    except ValueError, msg:
        # if we skipped this user for a reason, tell the person
        out.append("Skipped %s, reason: %s" % (id, msg))

# return something
return "\n".join(out)

Теперь у вас есть вся информация о пользователях, необходимая для их регистрации, благодаря чему регистрацию можно выполнить. Вы делаете это вызовом функции addMember, которая является функцией portal_registration и регистрирует пользователя.Словарь пар ключ/значение, таких как e-mail и name проходит через всю функцию. Для каждой группы вы вызваете getGroupById, а для полученного значения вызываете addMember. Как предполагает имя, это зарегистрирует пользователя в екоторой группе. Когда всё завершено, следует что-нибудь вывести для человека, начавшего импорт.

Чтобы запустить описанный сценарий на сайте, его необходимо поместить в папку Extensions вашего Plone-сервера и назвать import_users_with_groups.py. После этого вам необходимо вручную добавить группы, которые будут на вашем сайте (сценарий не создаёт групп) и приготовить .csv файл. Если список пользователей хранится в какой-то другой системе, вам следует позаботиться о том, чтобы создать файл в необходимом формате. Измените имя файла так, чтобы оно совпадало с именем, указанным в сценарии, добавьте на сайт объект типа external method со следующими свойствами:

  • ID: import_users_with_groups
  • Module name: import_users_with_groups
  • Function name: importUsers

После того, как вы добавили разработанный метод, нажмите Test для его запуска и получите результат!

Изменение настроек пользователя

Если вы устанавливаете новый продукт или новое свойство, может появиться необходимость массово изменить какие-либо метаданные. Например, если вы устанавливаете новый WYSIWYG редактор и хотите, чтобы он стал редактором по умолчанию для некоторых пользователей, необходимо выполнить 2 действия:

  • Изменить свойства по умолчанию для всех новых пользователей. Чтобы сделать это, нажмите portal_metadata и выберите вкладку Properties. Установки по умолчанию делаются здесь, в результате чего для всех новых пользователей будет установлено заданное значение.
  • Изменение настроек всех существующих пользователей, которое может быть выполнено только с использованием следующего external method:
def fixUsers(self):
    pm = self.portal_membership
    members = pm.listMemberIds()
 
    out = []
    for member in members:
        # now get the actual member
        m = pm.getMemberById(member)
        # get the editor property for that member
        p = m.getProperty('wysiwyg_editor', None)
 
        out.append("%s %s" % (p, member))
        if p is not None and p != 'Epoz':
            m.setMemberProperties({'wysiwyg_editor': 'Epoz',})
            out.append("Changed property for %s" % member)
    return "\n".join(out)

Поместите данный код в Python-модуль папки Extensions вашего Plone-сайта. Назовите модуль FixUserScript.py, после чего через ZMI добавьте external method со следующими свойствами:

  • ID: fixUsers
  • Module name: fixUserScript
  • Function name:fixUsers

Перейдите на вкладку Test для запуска кода. Сценарий будет выполнен для всех пользователей вашего сайта и установит значение для WYSIWYG редактора в "Epoz". Это будет сделано с помощью получения списка всех пользователей. Существует метод инструмена portal_membership, называемый listMemberIds, который данный список выдаёт. Для каждого участника проверяеся наличие некоторого свойства (в даном случае это свойство wysiwyg_editor). Если даное свойство не "Epoz", для его изменения вызывается setMemberProperties.

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

Подсчёт пользователей в группе

Ранее говорилось о возможности отсылать почтовые сообщения всем участникам в некоторой группе. Вы можете добавить данную возможность в workflow, но прежде всего вам необходим сценарий, чтобы это сделать. Пример получения списка пользователей использует две функции. Далее представлен сценарий getGroupUsers, который получает объект и возвращает список его пользователей.

##parameters=object=None
# object is the object to find all the members of the same group for
users = []
# get the creator
userName = object.Creator()
user = context.portal_membership.getMemberById(userName)
pg = context.portal_groups
 
# loop through the groups the user is in
for group in user.getGroups():
  group = pg.getGroupById(group)
 
   # loop through the users in each of those groups
  for user in group.getGroupUsers():
    if user not in users and user != userName:
      users.append(user)
 
return users

В данном примере вам предоставляется объект, у которого вам необходимо найти создателя с помощью вызова метода Creator. С тех пор, как вы узнали имя пользователя. создавшего документ, вы можете вызвать getGroups и метод, отображающий список всех участников группы, в котороую входит пользователь. В результате вы получаете список всех имён пользователей. Для каждого из этих пользователей вам необходимо выбрать лишь тех, которые не встречаются дважды или не являются людьми, которые участвовали в изменении данного объекта. Список пользователей будет содержать всех оставшихся пользователей из интересующей нас группы, в которую входит человек, являющийся владельцем объекта.

Вы можете добавить данный сценарий в сценарий почтового уведомления из главы 7, для его улучшения. Например, для сценария почтового уведомления вы можете вызвать то, что сделали следующим образом:
for user in mship.listMembers():
    if "Reviewer" in mship.getMemberById(user.id).getRoles():

Цикл пройдёт по всем пользователям и проверит, есть ли у них необходимая роль. Предыдущий скрипт вызывал getGroupUsers и располагался в portal_skins/custom folder. Это означает, что вы можете получить доступ к нему через пространство имён context с использованием acqisition. Коротко говоря, написание context.getGroupUsers(object) возвратит вам пользователей.

for user in mship.listMembers():
    if "Reviewer" in mship.getMemberById(user.id).getRoles():

Теперь вы посылаете почтовые сообщения всем членам группы, кроме тех, кто является рецензентом.

Информация о пользователях в Page Templates

В главе 6 вы создавали page template, который позволял обеспечивать обратную связь с администратором сайта путём предоставления соответствующей формы. В этой форме текстовое поле (input) позволяло пользователю указать e-mail адрес, который впоследствии проверялся. Однако, если пользователь аутентифицирован на сайте и вы знаете его адрес, было бы здорово заполнить данное поле автоматически.

Существующий код для поля input следующий:

<input type="text" name="email_address"
       tal:attributes="tabindex tabindex/next;
                       value request/email_address|nothing" />

Теперь, в случае если адрес электронной почты существует в объекте request ранее заполнявшейся форме, вам следует его показать. Если адрес отсутствует, необходимо посмотреть, существует ли почтовый адрес у текущего пользователя. Следующие изменения формы гарантируют, что поле с почтовым адресом будет заполнено.

<input type="text" name="email_address"
tal:define="user context/portal_membership/getAuthenticatedMember;
            email user/email|nothing"
       tal:attributes="tabindex tabindex/next;
                       value request/email_address|email|nothing" />

Отладка и понимание безопасности

Скорее всего безопасность - не одна из сложнейших для понимание частей Plone, но это безусловно одна из сложнейших частей для понимания и тестирования. Поскольку модель безопасности весьма раздробленная и сложная, может быть крайне тяжело найти почему и где происходят ошибки. Иногда сообщения об ошибках или информация предоставляются в тяжёлом для расшифровки виде или возникает сложность в трактовке полученного сообщения.

Тестирование установок безопасности также является немного тяжелым, поскольку на сайтах с множеством ролей необходимо производить полный реггрессионный тест для каждого из пользователей в любой ситуации. Из-за некоторой дороговизны данной процедуры, люди часто пренебрегают ей. Более того, наличие проблем в системе безопасности, возможно, самая ужасная вещь, которая может произойти с вашим сайтом, если он содержит конфиденциальную информацию. Plone позволяет делять вам всё, чтобы захотите. Существует даже возможность ограничить администраторский доступк сайту, поэтому будьте осторожны!

VerboseSecurity

VerboseSecurity это продукт, который по умолчанию включен в инсталлятор. Вы также можете скачать его по адресу http://hathaway.freezope.org/Software/VerboseSecurity. Как можно предположить из имени, продукт предоставляет детальное сообщение об ощибках, когда вы не можете что-либо сделать в Plone поскольку не авторизованы. Однако если вы допустили слишком неточную установку параметров безопасности, данный продукт вам не поможет.

VerboseSecurity может запустить Plone-сервер без ущерба для его работы, поэтому вы можете успешно его использовать как рабочий сервер. Существует множество случаев, когда кто-то не может выполнит ьчто-то, в результате чего возникает исключительная ситуация и модуль безопасности "умирает".

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

Оригинальная реализация рутинной проверки прав доступа была написана на языке Python. После того, как API стабилизировались и разработчики разобрались с производительностью, программа была переписана на C. По умолчанию запускается более быстрая реализация на С, и это означает, что сообщение о проблемах не может стать более исчерпывающим. Не следует запускать программу в режиме максимальной детализации происходящего. На самом деле существует достаточно информации и без этого. Если всё же необходимость запуска есть, Plone следует запускать со следующими переменными окружения:

ZOPE_SECURITY_POLICY=PYTHON

Чтобы увидеть VerbosSecurity в работе, всё. что вам необходимо сделать, это убедиться, что продукт расположен в директории Products (Для более подробной информации обратитесь к главе 10) и перезагрузите Plone. Перейдите в объект cookie_authentication, который предоставляет список свойств для аутентификации на вашем сайте и в имеющейся форме измените опцию для свойств login_page с require_login на пустое значение, как показано на рисунке 9-14.

0914.png
Рисунок 9-14. Изменение установок аутентификации для Plone-сайта

Теперь вы можете создать обстоятельство для возникновения ошибки, которую хотите отладить. Вспомните вход пользователя, который сопровождался ошибками. Это тот случай, когда удобно использовать два различных браузера для доступа на сайт: один - для администрирования, а второй - для тестирования. При возникновении ошибкок аутентификации на экране появится соответствующий диалог. В этот момент нажмите Cancel, и вы увидите детальное сообщение о возникшей ошибке, примерно такое, как показано на рисунке 9-15.

0915.png
Рисунок 9-15. Хорошо-детилизированное сообщение об ошибке

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

Общие проблемы

Существует пара проблем, которые весьма быстро возникают при работе с Plone. Одна из них не связана с Plone явно, но систематически повторяется. Всегда убеждайтесь, что пользователи, при работе которых возникают ошибки, действительно те самые пользователи. Очень часто можно услышать фразу: "Работает в одном браузере и не работает в другом". Это часто случается потому, что в одном браузере пользователь имеет одну роль, а в другом - другую.

При возникновении подобной проблемы дважды проверьте, какую роль имеет учётная запись,под которой вы находитесь на сайте. Для этого следует перейти в acl_users, выбрать пользователя и убедиться, что у него именно та роль, которая должна быть. Подумайте о том, к какой группе может относится пользователь. Просмотр acl_users покажет что и как, потому что пользователи могут иметь дополнительные роли в группе. В заключение, запомните, что роль пользователя может быть изменена с помощью локальных ролей для папок или других объектов. Отследить это достаточно сложно, поскольку нет очевидных способов узнать для каких папок назначены локальные роли.

После того, как вы убедились кто есть кто из пользователей и какие у них роли, вы можете узнать какие права доступа установлены для того или иного объекта. Как вы видели, два различных объекта (например, два документа) могут иметь различные права доступа и различные роли. Пользователь, который создаёт документ будет иметь роль owner, а другой пользователь только роль member дл данного объекта. Поскольку настройка workflow (рабочих циклов) изменяет права доступа к документу, который проходит через состояния рабочего цикла, это также может повлиять на установленные права доступа.

Блокировка Plone

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

Для настоящих параноиков можно предложить удалить все элементы пользовательского интерфейса для прекращения возможности даже представлять о каких-то нежелательных изменениях. Естественно, простого удаления какой-либо вкладки или запрещения доступа к некоторому шаблону недостаточно, если пользователи по-прежнему могут видеть и редактировать документы. Имея некоторые знания о Plone они смогут используя различные хитрые механизмы всё же запустить нужную страницу. Часто в Plone вы будете понимать, что даже если ваших усилий было достаточно, всегда существует возможностьполучения доступа к странице редактирования с помощью взлома его URL. Однако, в большинстве случаев вы всё же не будете имеете возможность редактировать страницу, а лишь ограничитесь просмотром формы редактирования.

Если ваш сервер запущен без широких ограничений доступа, убедитесь, что он запущен совместно с другим сервером, помимо ZServer'а. Как будет рассказано в главе 10, ZServer, которому приходят пакеты, реализован обычным образом без массовых проверок безопасности, которые действительно необходимы. Рассмотрите возможность передачи части полномочий другим Zope-сервисам, таким как FTP и WebDAV, если у вас есть инструкции по их использованию.

Интеграция Plone с другими сервисами

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

Безопасность на сервере

В предыдущих разделах была рассмотрена безопасность пользователей внутри Plone, однако существует ещё одна сторона дела: безопасность и установки Plone сервера внутри вашей операционной системы. Поскольку Plone является Web-приложением, раздача любых прав доступа к нему может стать критической. Инсталляционный процесс является довольно хорошим. Во время установки система собирает большинство иноформации о необходимых для вас правах доступа, однако есть некоторые моменты, которые следует учесть, о которых мы сейчас поговорим.

Пользователь, запускающий Zope

Вам следует убедиться, что пользователь, от имени которого запускается Zope имеет минимальное количество прав доступа для выполнения различных задач. Пользователь, который запускает Zope, должен иметь возможность чтения и записи во все каталоги Zope в файловой системе сервера. Пользователю также будет необходимо возможность записи в каталоги, которые содержат log-файлы (журналы) и базу данных: это директории var и log.

Наилучший способ добиться этого в Linux - добавить специального пользователя с именем, например, plone, после чего ограничить возможность доступа пользователя в нежелательные для этого места.

Если в Linux вы захотите, чтобы Plone после запуска прослушивал порт с небольшим номером (меньше 1024), например 21, 80, вам следует запускать его из-под пользователя root. Plone будет прослушивать данные порты и заменять других активных пользователей. Чтобы сделать это, вы должны указать имя пользователя (effective-user) в конфигурационном файле zope.conf. Наилучшим способом было бы вообще не делать этого, а указать Zope на необходимость прослушивания порта с большин значением, например 8080. Данный порт вы сможете защитить используя различные брандмауэры, а в качестве кеширующего сервера, выполняющего роль proxy, использовать Apache, запущенный на 80 порту. В глава 10 это обсуждается более подробно.

В Windows также существует пользователь, от имени которого запускается сервис. По умолчанию это LocalSistem. Данного пользователя можно изменить. Если вы запускаете Plone на компьютере, не имеющем сервисов (делать это не рекомендуется), Plone будет запущен локально от имени того пользователя, кто запустил сервер.

Некоторые продукты могут требовать установки дополнительного программного обеспечения, которое обеспечивает такие необходимые свойства, как например работа с изображениями, преобразование документов и т.п. В случае установки подобных продуктов учтите, что они могут потребовать проведения некоторых настроек, чтобы успешно интегрироваться в Plone. Например для работы с PDF файлами можно установить pdftohtml, но чтобы команды данного продукта были читаемыми, необходимо запустить сервис от имени пользователя с бОльшими правами доступа, чтобы Zope мог взаимодействовать с установленным ПО. В данном случае, если сервер защищён брандмауэром, это не является проблемой.

Получение аварийного доступа

Если у вас существует Plone-сайт, но вы не знаете или просто забыли пароль для этого, вы можете получить аварийный доступ к сайту. Чтобы сделать это, вам необходимо иметь файл системного доступа к установленному Plone-сайту. Если файл отсутствует, его необходимо найти (сделать), прежде чем продолжать работу.

Чтобы сделать это, перейдите в папку установленного Zope и найдите сценарий (файл) zpasswd.py. обычно он расположен в /opt/Zope-2.7/bin/zpasswd.py. Теперь чтобы создать пароль, вы должны выполнить следующее:

$ cd /var/zope
$ python /opt/Zope-2.7/bin/zpasswd.py access
 
Username: emergency
Password:
Verify password:
 
Please choose a format from:
 
SHA - SHA-1 hashed password
CRYPT - UNIX-style crypt password
CLEARTEXT - no protection.
 
Encoding: SHA
Domain restrictions:

Указанная процедура создаст файл доступа к установленному Zope. Его следует перезагрузить и зайти в ZMI используя имя пользователя и пароль, указанные в сценарии. Пользователь имеет специальное название emergency user. После того, как вы вошли в Zope под данным пользователем, вы не можете создавать какие-либо объекты, однако можете создать для себя нового пользователя. Из соображений безопасности, файл доступа следует удалить.

Получение аварийного доступа под Windows

Инсталляция системы подWindows содержит приложение с удобным пользовательским интерфейсом для более лёгкого получения аварийного доступа. Выберите Пуск-Программы-Plone-Plone (Start - Program Files - Plone - Plone), перейдите к опции Emergency User. Это позволит создать нового пользователя, изменить пароль аварийного пользователя или удалить пользователя, как показано на рисунке 9-16.

0916.png
Рисунок 9-16. Создание нового аварийного пользователя

Для создания пользователя нажмите Create User. В появившемся диалоге укажите имя пользователя и пароль. Это создаст файл, содержащий имя пользователя и пароль. После добавления или изменения пароля Zope необходимо перезапустить. Чтобы перезапустить Plone, перейдите на вкладку Control, нажмите Stop, после чего нажмите Start. Нажмите Manage Root и укажите имя пользователя, которое указывали только что. Вы войдёте на сайт в качестве аварийного пользователя, что означает невозможность создавать объекты, но предоставляет возможность создание нового пользователя и вспоследствии войти под ним на сайт.

Использование внешних систем аутентификации

Plone хранит информацию обо всех своих пользователях в объектной базе данных Zope в различных списках, как видно из главы 8. Как обычно, это не очень хорошо, и в некоторых случаях вы можете захотесь использовать какой-либо другой сервис для аутентификации пользователей. Наиболее общая альтернативная система это LDAP или Active Directory от Microsoft, которая использует LDAP.

Естественно, вы можете захотеть произвести интеграцию с другим приложением, которое хранит информацию о пользователях в реляционной БД. На момент написания ASPN сайт ActiveState использует Zope для работы с контентом, а для аутентификации пользователей применяется Passport system от Microsoft. В настоящий момент установка большого числа ПО - довольно популярное занятие, за что следует сказать спасибо многим разработчикам. В процессе установки выясняется, что наиболее сложной частью является построение систем и установка связей между ними.

ПРЕДОСТЕРЕЖЕНИЕ: В следующем разделе вы будете выполнять различные действия в окресностях папок acl_users внутри Plone-сайта. Никогда не удаляйте и не изменяйте папку acl_users в корне установленного Zope. Если вы сделаете это и ваша пользовательская папка повредится по какой-либо причине (например, сервер упадёт), сайт будет заблокирован и вы более никогда не получите возможность получить в него доступ, даже если вы администратор. Убедитесь, что вы изменяете только папки acl_users внутри Plone-сайта!

Использование LDAP

Прежде всего необходимо установить LDAP сервер или что-то, что сможет с ним соединиться, например Active Directory (несмотря на то, что Active Directory имеет несколько слабых мест). В данном примере демонстрируется работа с openLDAP на сервере Red Hat и сервером Windows. Версию LDAP для Windows можно найти по адресу http://www.zope.org/Members/volkerw/LdapWin32. Она была протестирована с использованием Python 2.3.

Скачайте и распакуйте файл, поместите его содержимое в c:\Program Files\Plone\Python\lib\site-packages, установите LDAPUserFolder.

openLDAP для Linux вы можете скачать по адресу http://www.openldap.org/. Протестированная версия включает в себя RPM'ы 2.0.27-2.8.0 и 2.0.27-2.8.0. После постоения данного продукта по имеющимся инструкциям следует посетить http://python-ldap.sourceforge.net/, скачать библиотеки Python LDAP и построить их. Убедитесь, что вы используете тот же самый интерпретатор Python, который используется для запуска Plone.

После прохождения описанных шагов необходимо убедиться в том, что модуль _ldap.so импортируется из Python. Самый простой способ проверить это, запустить следующую команду:

$ python -c "import _ldap"

Если сообщения об ошибках отсутствуют, значит модуль импортируется корректно. Если ошибки есть, вы должны проверить все выполненные шаги. С адреса http://www.dataflake.org/software/ldapuserfolder необходимо скачать LDAPUserFolder, распаковать архив и поместить в папку Products вашего Zope. Например:

$ tar -zxf LDAPUserFolder-2_1beta2.tgz
$ mv LDAPUserFolder /var/zope/Products

Перезапустите Plone, перейдите в control panel и убедитесь, что объект на странице products отображается корректно. Более детельно об этом будет рассказано в главе 10.

Теперь в Plone должна появиться возможность нажать acl_users, нажать Sources и прокрутить страницу вниз до опции User source #1. Выберите LDAPUserFolder, укажите, что вы уверены, как показано на рисунке 9-17. Это создаст новую пользовательскую папку и заменит имеющуюся, поэтому убедитесь, что вы не потеряете никаких критических данных: это самое время сделать резервную копию. Нажмите ОК.

0917.png
Рисунок 9-17. Добавление LDAPUserFolder

В свойства папки LDAPUserFolder добавились свойства, совпадающие с существующими у LDAP. Теперь вы можете перейти на вкладку Users и производить поиск пользователей, сущесвующих в директории LDAP.

Реляционные базы данных и другое

Прекрасная замена папки пользователей называется exUserFolder. Она соответствует расширяемой пользовательской папке. Её очень легко установить, просто скачав с http://prdownloads.sourceforge.net/exuserfolder/exUserFolder-0_20_0.tgz и проделав стандартную операцию её распаковки в папку Products. После перезапуска Plone у вас должна быть возможность нажать acl_users, выбрать Sources и аналогично предыдущему случаю прокрутить экран вниз для выбора Users source #1. Выберите exUserFolder и отметьте I'm sure.

В настоящий момент exUserFolder может работать с пользовтелями из следующих источников:

  • Radius
  • SMB
  • LDAP
  • Relational databases

Чтобы выполнить это, необходимо установить специфические адаптеры для необходимой базы данных. К счастью, адаптеры для всех известных СУБД существуют. Для получения более подробной информации о работе с БД обратитесь к Zope Book по адресу http://zope.org/Documentation/Books/ZopeBook/2_6Edition/RelationalDatabases.stx

Закажите веб-сайт

Сегодня веб-сайт - необходимый инструмент любой фирмы. Сайт предоставит информацию о Вашей деятельности всем пользователям всемирной сети.

Предлагаем Вам неограниченные возможности - размещайте в сети Интернет информацию о Ваших услугах, продукцию, взаимодействуйте с вашими клиентами, дилерами и удалёнными сотрудниками при помощи всемирной сети Интернет, приобретайте новых клиентов и партнеров!

Используйте интернет

Наша компания может быть полезна везде, где есть Интернет

  • Помочь Вам понять мир интернет-технологий и необходимость создания веб-представительства в сети Интернет
  • Донести самую важную информацию до Вашего рынка, клиента
  • Вызвать спрос на Ваше предложение
  • Донести Вашу индивидуальность, преимущества, полезность
  • Создать удобное в использовании веб-приложение для Ваших нужд
© 2004-2015. Магнитогорская студия веб-дизайна «Prime»