[xwiki-devs] Assign rights to a Group in a Space
Hi All, What I'm trying to get is: User logs into XWiki through CAS Auth, I also have a webservice to get remote user credentials (where a User can be in many Groups), and some rights over that groups (only membership), so what I want is to: - Create a Space for each remote "Group" (named "remoteGroupSpaceX"), - Create a Group in XWiki (named "remoteGroupX") - Assign "edit" right to the "remoteGroupX" over "remoteGroupSpaceX". I already have created the Space (/xwiki/bin/view/remoteGroupSpace/), the Group (XWiki.remoteGroupX) and what I'm trying to get is the XWikiRights from the remoteGroup, but I can't find where can I get the XWikiRights object. I tried to duplicate (through XWikiDocument.duplicate(EntityReference) method) an existing group (XWikiAdminGroup) and search where is the XWikiRight object, and then change the "levels" field to "edit", and saving the remoteGroup with the modified rights, but the Edit button is still there. Here's a sample of my code: private void assignRights(String spaceName, String groupName, String rights, XWikiContext context) throws XWikiException { // Prepare EntityReferences WikiReference wikiRef = new WikiReference("XWiki"); SpaceReference xwikiSpaceRef = new SpaceReference("XWiki", wikiRef); SpaceReference remoteSpaceRef = new SpaceReference(spaceName, wikiRef); DocumentReference refGroup = new DocumentReference(new EntityReference(groupName, EntityType.DOCUMENT, xwikiSpaceRef)); DocumentReference refRights = new DocumentReference(new EntityReference("XWikiRights", EntityType.DOCUMENT, remoteSpaceRef)); // Get the XWikiDocument relative to the Group XWikiDocument docGroup = context.getWiki().getDocument(refGroup, context); // Get the XWikiRights from the Group BaseObject groupRights = docGroup.getXObject(refRights); // Modify rights groupRights.set("levels", rights, context); context.getWiki().saveDocument(docGroup, context); } Where: String spaceName = "remoteGroupSpaceX"; String groupName = "remoteGroupX"; String rights = "edit"; I know about relation between XWikiGlobalRights and XWikiRights and also about rights priority (Page > Space > Wiki / page.XWikiRights > space.XWikiRights > wiki.XWikiGlobalRights). So my plan is: Everybody has "view" (XWiki.XWikiAllUsers) right in the whole wiki, and only members of each "remoteGroupX" has "edit" right over their own space "remoteGroupSpaceX". I'm a little bit lost with this and I hope any help. Thank you, Marco A. Gonzalez
Hi Marco, On 04/01/2011 12:53 PM, Marco Antonio González wrote:
Hi All,
What I'm trying to get is: User logs into XWiki through CAS Auth, I also have a webservice to get remote user credentials (where a User can be in many Groups), and some rights over that groups (only membership), so what I want is to:
- Create a Space for each remote "Group" (named "remoteGroupSpaceX"), - Create a Group in XWiki (named "remoteGroupX") - Assign "edit" right to the "remoteGroupX" over "remoteGroupSpaceX".
I already have created the Space (/xwiki/bin/view/remoteGroupSpace/), the Group (XWiki.remoteGroupX) and what I'm trying to get is the XWikiRights from the remoteGroup, but I can't find where can I get the XWikiRights object.
I tried to duplicate (through XWikiDocument.duplicate(EntityReference) method) an existing group (XWikiAdminGroup) and search where is the XWikiRight object, and then change the "levels" field to "edit", and saving the remoteGroup with the modified rights, but the Edit button is still there.
Here's a sample of my code:
private void assignRights(String spaceName, String groupName, String rights, XWikiContext context) throws XWikiException {
// Prepare EntityReferences WikiReference wikiRef = new WikiReference("XWiki");
Are you sure you have a wiki named "XWiki"? The main wiki is called by default "xwiki" (lower case). Anyway, you should avoid hard-coding the name of the main wiki. You should write instead: context.getMainXWiki() --> for main wiki or, context.getDatabase() --> for current wiki.
SpaceReference xwikiSpaceRef = new SpaceReference("XWiki", wikiRef);
SpaceReference remoteSpaceRef = new SpaceReference(spaceName, wikiRef); DocumentReference refGroup = new DocumentReference(new EntityReference(groupName, EntityType.DOCUMENT, xwikiSpaceRef)); DocumentReference refRights = new DocumentReference(new EntityReference("XWikiRights", EntityType.DOCUMENT, remoteSpaceRef));
The above 5 lines are equivalent to this: DocumentReference refGroup = new DocumentReference(context.getDatabase(), "XWiki", groupName); DocumentReference refRights = new DocumentReference(context.getDatabase(), spaceName, "XWikiRights");
// Get the XWikiDocument relative to the Group XWikiDocument docGroup = context.getWiki().getDocument(refGroup, context);
// Get the XWikiRights from the Group BaseObject groupRights = docGroup.getXObject(refRights); // Modify rights groupRights.set("levels", rights, context);
context.getWiki().saveDocument(docGroup, context);
I see 2 mistakes here: (1) You assume that space level rights are saved on the group document. You should edit the group document using the object editor and see what objects it has attached. XWikiRights objects don't have any information about the target entity (page/space/wiki) because the target entity is determined based on the document where XWikiRights objects are attached. So for space rights you should look at the objects attached to <SpaceName>.WebPreferences page. (2) In order to retrieve an object from a document you need the class name/reference, which is the same no matter where the objects are attached. The class reference fro XWikiRights is xwiki:XWiki.XWikiRights not xwiki:<SpaceName>.XWikiRights . Now, if I go to the space administration and edit the user/group rights I get XWiki.XWikiGlobalRights objects attached to <SpaceName>.WebPreference so you should use this class instead of XWikiRights. I would start with this code (which I haven't tested): ----------8<---------- DocumentReference rightsClassRef = new DocumentReference(context.getMainWiki(), "XWiki", "XWikiGlobalRights"); DocumentReference spacePrefsRef = new DocumentReference(context.getDatabase(), spaceName, "WebPreferences"); // Get the space preferences page, where space level rights are saved. XWikiDocument spacePrefs = context.getWiki().getDocument(spacePrefsRef, context); // Get the XWikiGlobalRights from the space preferences page. BaseObject spaceRights = spacePrefs.getXObject(rightsClassRef); // Modify space rights. spaceRights.set("levels", rights, context); spaceRights.set("groups", groupName, context); context.getWiki().saveDocument(spacePrefs, context); ---------->8---------- Hope this helps, Marius
}
Where: String spaceName = "remoteGroupSpaceX"; String groupName = "remoteGroupX"; String rights = "edit";
I know about relation between XWikiGlobalRights and XWikiRights and also about rights priority (Page> Space> Wiki / page.XWikiRights> space.XWikiRights> wiki.XWikiGlobalRights).
So my plan is: Everybody has "view" (XWiki.XWikiAllUsers) right in the whole wiki, and only members of each "remoteGroupX" has "edit" right over their own space "remoteGroupSpaceX".
I'm a little bit lost with this and I hope any help.
Thank you, Marco A. Gonzalez _______________________________________________ devs mailing list [email protected] http://lists.xwiki.org/mailman/listinfo/devs
Hi Marius,
On 04/03/2011 13:43 PM, Marius Dumitru Florea wrote
Hi Marco,
On 04/01/2011 12:53 PM, Marco Antonio González wrote:
Hi All,
What I'm trying to get is: User logs into XWiki through CAS Auth, I also have a webservice to get remote user credentials (where a User can be in many Groups), and some rights > over that groups (only membership), so what I want is to:
- Create a Space for each remote "Group" (named "remoteGroupSpaceX"), - Create a Group in XWiki (named "remoteGroupX") - Assign "edit" right to the "remoteGroupX" over "remoteGroupSpaceX".
I already have created the Space (/xwiki/bin/view/remoteGroupSpace/), the Group (XWiki.remoteGroupX) and what I'm trying to get is the XWikiRights from the remoteGroup, but I can't find where can I get the XWikiRights object.
I tried to duplicate (through XWikiDocument.duplicate(EntityReference) method) an existing group (XWikiAdminGroup) and search where is the XWikiRight object, and then change the "levels" field to "edit", and saving the remoteGroup with the modified rights, but the Edit button is still there.
Here's a sample of my code:
private void assignRights(String spaceName, String groupName, String rights, XWikiContext context) throws XWikiException {
// Prepare EntityReferences WikiReference wikiRef = new WikiReference("XWiki");
Are you sure you have a wiki named "XWiki"? The main wiki is called by default "xwiki" (lower case). Anyway, you should avoid hard-coding the name of the main wiki. You should write instead:
Yes, you are right, I "simplified" the code a bit for easier understanding and made the caps mistake. The current main wiki is 'xwiki' and I get it from context.getDatabase() method.
context.getMainXWiki() --> for main wiki or, context.getDatabase() --> for current wiki.
SpaceReference xwikiSpaceRef = new SpaceReference("XWiki", wikiRef);
SpaceReference remoteSpaceRef = new SpaceReference(spaceName, wikiRef); DocumentReference refGroup = new DocumentReference(new EntityReference(groupName, EntityType.DOCUMENT, xwikiSpaceRef)); DocumentReference refRights = new DocumentReference(new EntityReference("XWikiRights", EntityType.DOCUMENT, remoteSpaceRef));
The above 5 lines are equivalent to this:
DocumentReference refGroup = new DocumentReference(context.getDatabase(), "XWiki", groupName); DocumentReference refRights = new DocumentReference(context.getDatabase(), spaceName, "XWikiRights");
Thanks for the tip!
// Get the XWikiDocument relative to the Group XWikiDocument docGroup = context.getWiki().getDocument(refGroup, context);
// Get the XWikiRights from the Group BaseObject groupRights = docGroup.getXObject(refRights); // Modify rights groupRights.set("levels", rights, context);
context.getWiki().saveDocument(docGroup, context);
I see 2 mistakes here:
(1) You assume that space level rights are saved on the group document. You should edit the group document using the object editor and see what objects it has attached. XWikiRights objects don't have any information about the target entity (page/space/wiki) because the target entity is determined based on the document where XWikiRights objects are attached. So for space rights you should look at the objects attached to <SpaceName>.WebPreferences page.
On my <SpaceName>.WebPreferences, I only get a XWiki.XWikiGlobalRights object, so I proceed to change the "levels" field, but anything changes whatever value I put on it.
(2) In order to retrieve an object from a document you need the class name/reference, which is the same no matter where the objects are attached. The class reference fro XWikiRights is xwiki:XWiki.XWikiRights not xwiki:<SpaceName>.XWikiRights . Now, if I go to the space administration and edit the user/group rights I get XWiki.XWikiGlobalRights objects attached to <SpaceName>.WebPreference so you should use this class instead of XWikiRights.
I would start with this code (which I haven't tested):
----------8<---------- DocumentReference rightsClassRef = new DocumentReference(context.getMainWiki(), "XWiki", "XWikiGlobalRights");
context.getMainWiki() must be context.getMainXWiki().
DocumentReference spacePrefsRef = new DocumentReference(context.getDatabase(), spaceName, "WebPreferences"); // Get the space preferences page, where space level rights are saved. XWikiDocument spacePrefs = context.getWiki().getDocument(spacePrefsRef, context); // Get the XWikiGlobalRights from the space preferences page. BaseObject spaceRights = spacePrefs.getXObject(rightsClassRef); // Modify space rights. spaceRights.set("levels", rights, context); spaceRights.set("groups", groupName, context);
// Set "1" to allow <rights>, or "0" to deny them. spaceRights.set("allow", "1", context);
context.getWiki().saveDocument(spacePrefs, context); ---------->8----------
Inspecting the spaceRights.getXObjects(rightsClassRef) I get a treeMap that has one item for each right, I'll continue testing how to mix allow/deny rights at the same time, for example allow "edit" and deny "admin". Thank you,
Hope this helps, Marius
}
Where: String spaceName = "remoteGroupSpaceX"; String groupName = "remoteGroupX"; String rights = "edit";
I know about relation between XWikiGlobalRights and XWikiRights and also about rights priority (Page> Space> Wiki / page.XWikiRights> space.XWikiRights> wiki.XWikiGlobalRights).
So my plan is: Everybody has "view" (XWiki.XWikiAllUsers) right in the whole wiki, and only members of each "remoteGroupX" has "edit" right over their own space "remoteGroupSpaceX".
I'm a little bit lost with this and I hope any help.
Thank you, Marco A. Gonzalez _______________________________________________ devs mailing list [hidden email] http://lists.xwiki.org/mailman/listinfo/devs
devs mailing list [hidden email] http://lists.xwiki.org/mailman/listinfo/devs
participants (2)
-
Marco Antonio González -
Marius Dumitru Florea