Установите права пользователя и группы на документ в XWiki

Я пишу компонент Java, который создает все страницы в вики. Как лучше всего назначить права или группы пользователей, которые могут просматривать страницу или пробелы из компонента службы Java? Очень сложно найти подробности об этом в API.


person Gerrie van Wyk    schedule 03.12.2015    source источник


Ответы (1)


Вы не найдете подробностей в API, потому что API прав предназначен только для чтения информации о правах, а не для установки прав.

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

  1. Разрешения устанавливаются добавлением на страницы объектов типа «XWiki.XWikiRights»
  2. эти объекты имеют следующие атрибуты:

    • groups : a string containing a comma separated list of group references (e.g. XWiki.XWikiAdminGroup,XWiki.XWikiAllGroup for the default admin and "all members" group)
    • users: строка, содержащая список ссылок на пользователей, разделенных запятыми (например, xwiki:XWiki.Admin,XWiki.Admin будет описывать главного администратора вики и учетную запись администратора в локальной вики.
    • levels: строка, содержащая разделенный запятыми список разрешений, на которые влияет эта запись, например view,comment,edit
    • allow: целое число, которое должно иметь два значения: 1 означает, что запись является "разрешить это право", 0 означает "запретить эти права"

Поля groups и users могут быть пустыми, хотя обычно одно из них заполнено данными. levels и allow должны быть установлены с некоторыми значениями.

Одним из примеров того, как устанавливается разрешение на странице, является (внутренний) метод XWiki.protectUserPage, который устанавливает разрешения для вновь созданного пользователя таким же образом, как этот пользователь может редактировать их на одной странице профиля:

public void protectUserPage(String userName, String userRights, XWikiDocument doc, XWikiContext context)
    throws XWikiException
{
    DocumentReference rightClassReference = getRightsClass(context).getDocumentReference();

    EntityReference relativeRightClassReference =
        rightClassReference.removeParent(rightClassReference.getWikiReference());

    // Allow users to edit their own profiles
    BaseObject newuserrightsobject = doc.newXObject(relativeRightClassReference, context);
    newuserrightsobject.setLargeStringValue("users", userName);
    newuserrightsobject.setStringValue("levels", userRights);
    newuserrightsobject.setIntValue("allow", 1);
}

Здесь первые несколько строк немного сложнее, чтобы убедиться, что страница класса XWiki.XWikiRights присутствует и правильно инициализирована; без вреда вы сможете сделать что-то более простое, например:

    BaseObject newrightsobject = doc.newObject("XWiki.XWikiRights", context);

userRights обычно edit здесь (только тогда, когда я искал код, я обнаружил, что он действительно настраивается ...); userName - это полное имя страницы профиля пользователя здесь (например, XWiki.NewUser)

Фактический полный код можно посмотреть на github, например. для версии 7.2:

https://github.com/xwiki/xwiki-platform/blob/xwiki-platform-7.2/xwiki-platform-core/xwiki-platform-oldcore/src/main/java/com/xpn/xwiki/XWiki.java#L3366

Наконец, чтобы различать права, предоставленные только определенной странице, и права, предоставленные странице и всем ее подстраницам: если вы хотите, чтобы объект прав был действителен и для подстраниц, не добавляйте его к самой странице, а создайте специальный подстраницу с именем WebPreferences и добавьте на эту страницу объект типа XWiki.XWikiGlobalRights (с такими же полями).

Еще несколько указателей:

для получения дополнительных сведений о том, как работают права доступа, см. http://platform.xwiki.org/xwiki/bin/view/AdminGuide/Access+Rights, особенно справочный раздел: "Обзор разрешений"

Если вы установили расширение «Admin Tools», вы можете просмотреть страницу «ShowRights», чтобы увидеть все нужные объекты в вашей вики.

person Clemens Klein-Robbenhaar    schedule 04.12.2015
comment
Спасибо за отличный ответ! - person Gerrie van Wyk; 25.01.2016
comment
Как мне создать новую группу, например MyCompany.HRGroup, MyCompany.AdminGroup, MCompany.EngineersGroup, с разными правами, а затем добавлять в них пользователей в зависимости от их роли? - person Nawaz; 20.03.2020
comment
@Nawaz, если вы не хотите добавлять эти группы в пространство XWiki, вы можете создать пустую страницу для каждой из них, а затем в редакторе объектов добавить к ней объект типа XWiki.XWikiGroups. Не забудьте установить флажок для страницы терминала при ее создании. Если вы хотите сделать это программно, а не через пользовательский интерфейс, ответ будет заключаться в том, чтобы ждать комментария; задайте новый вопрос. - person Clemens Klein-Robbenhaar; 22.03.2020
comment
@ ClemensKlein-Robbenhaar: а, понятно. Я не знал, что XWiki - это пробел. Думаю, я смогу это использовать. Я тоже в порядке с XWiki.HRGroup. Да, я хочу сделать это программно. Я задам новый вопрос. - person Nawaz; 22.03.2020
comment
вот так: заголовок stackoverflow.com/questions/60794694/ - person Nawaz; 22.03.2020
comment
Прочтите свой ответ несколько раз, и я думаю, что я лучше понимаю вещи (хотя все еще недостаточно для выполнения необходимой мне работы). Хотел бы я проголосовать за него несколько раз, потому что он этого заслуживает. Вики-документ не очень подходит для помощи в программировании. Я бы хотел, чтобы они добавили документацию по API, методам и некоторым типичным примерам. Прочитав кодовую базу, я понял, что все является страницей в XWiki: будь то пользователи, права, группы в дополнение к обычным (содержательным) страницам. - person Nawaz; 22.03.2020
comment
Почему вы это сделали: rightClassReference.removeParent(rightClassReference.getWikiReference());. Чтобы избежать неявных прав, унаследованных от родителей (как описано в здесь ваши примеры)? - person Nawaz; 30.03.2020
comment
Это всего лишь фрагмент реального кода ядра XWiki. Проблема в том, что полный документ содержит имя вики (например, xwiki:XWiki.XWikiGlobalRights), но для поиска класса необходимо иметь ссылку без префикса вики (например, XWiki.XWikiGlobalRights). Это то, что делает код. Лично я предпочитаю использовать в этих случаях просто строки вместо ссылок, даже если соответствующие методы устарели, так как я еще не закончил свою докторскую диссертацию по ссылкам XWiki. - person Clemens Klein-Robbenhaar; 31.03.2020