Liferay 6.1中如何从用户组继承站点角色权限给他们的成员?

Posted

技术标签:

【中文标题】Liferay 6.1中如何从用户组继承站点角色权限给他们的成员?【英文标题】:How to inherit site role permissions from users groups to their members in Liferay 6.1? 【发布时间】:2014-05-20 12:35:37 【问题描述】:

我正在使用 Liferay 6.1,并且我有一个名为 MySite Approvers 的用户组,并为其分配了站点 MySite 的站点角色 Site Approver。

我希望属于此用户组的用户也将继承 MySite 的站点批准者角色,也就是继承此站点角色的权限。

但用户不继承站点角色权限,并且在控制面板中 MySite 的站点成员中,用户站点角色为空。

我该如何解决?我应该编写一个钩子,定期将站点角色添加到具有站点角色的用户组的成员中吗?

【问题讨论】:

您介意使用常规角色而不是站点角色吗? @yannicuLar 是的,我需要站点角色功能而不是常规角色。将用户分配到“MySite Approvers”组应该为特定站点的用户提供站点审批者功能。 而且“Site Approver”是您创建的自定义站点角色,对吧? 对,是自定义站点角色。 Μαρία,您确定不能使用常规角色吗?您可以将“站点审批者”角色移植到常规角色,并将其分配给“我的站点审批者”用户组。我认为这对你来说应该很好。 【参考方案1】:

Liferay 不会在员工角色配置文件中显示您的站点角色“站点批准者”,因为该角色不与单个用户关联,而是分配给用户组。

但是,只要用户是您的用户组“MySite Approvers”的成员,就应授予用户“Site Approver”中定义的权限。

Liferay 文档link here 说:

这是具有适当角色的门户用户查看内容和 决定拒绝它(将其移回开头)或接受它 (将其过渡到下一步)。

因此,对于工作流程,与用户建立直接的角色关联非常重要。不是某种与用户相关的权限。

我想这就是设计功能的方式。在我看来这不是一个错误,因为工作流程不期望任何权限,但期望用户成为角色的成员。

【讨论】:

好的,第一部分是有意义的,为了通过用户组将用户的个人成员资格与站点角色分开。但至于没有给用户权限,例如我有一个使用站点审批者角色的审批者工作流定义。这不考虑用户组成员对站点角色的影响。可能这只是工作流模块的一个错误。我还可以进一步测试其他权限,看看它们是否尊重从用户组继承的角色。 根据上面的评论更新了上面的答案。 但用户是角色站点批准者的间接成员,因为用户是与站点角色关联的用户组的成员。我认为从 LDAP 导入用户和用户组并将用户组与站点角色相关联应该在所有情况下都能无缝工作,甚至是工作流,并且不需要将每个用户手动关联到站点角色。如果这适用于其他授权机制案例,我希望也适用于工作流。 不幸的是,它似乎不像那样工作。您也可以在liferay论坛中查询不同的观点。 在我看来这是一个相当大的错误,因为即使工作流期望用户成为角色的成员,这也应该检查间接成员资格。否则,LDAP 导入的用户组和站点角色功能无法自动运行,管理员无需直接将站点角色重新分配给特定用户。【参考方案2】:

我遇到了类似的问题,试图通过每个注册的门户用户继承组织角色。经过大量测试后,我意识到只有常规角色会被传播,并且使用 PermissionChecker 和 RoleLocalServiceUtil 的行为与预期一样。

如果您尝试创建常规角色,而不是站点角色,您可以将该角色分配给用户、用户组、组织或站点 我仍然没有找到关于常规角色、组织角色和站点角色之间区别的完整文档,但我的印象是,例如站点角色不是您将分配给站点所有用户的角色

更新:我打开了 liferay 6.1.0 的源代码,并在 RoleLocalServiceUtil.hasUserRole

/**
* Returns <code>true</code> if the user is associated with the named
* regular role.
*
* @param userId the primary key of the user
* @param companyId the primary key of the company
* @param name the name of the role
* @param inherited whether to include the user's inherited roles in the
search
* @return <code>true</code> if the user is associated with the regular
role; <code>false</code> otherwise
* @throws PortalException if a role with the name could not be found in the
company or if a default user for the company could not be found
* @throws SystemException if a system exception occurred
*/
public static boolean hasUserRole(long userId, long companyId,
    java.lang.String name, boolean inherited)
    throws com.liferay.portal.kernel.exception.PortalException,
        com.liferay.portal.kernel.exception.SystemException 
    return getService().hasUserRole(userId, companyId, name, inherited);

注意“常规角色”

现在我没有时间检查所有对该函数的引用,但对我来说,这清楚地表明 Liferay 的角色/权限检查机制可能不适用于 any 角色类型

【讨论】:

另外两种角色的名称分别表示组织和站点范围。我认为他们的权限范围很好,在某些情况下似乎不起作用的是权限从用户组的站点角色权限传播到其成员。对于门户范围的权限,我也使用了常规角色,但我还需要站点角色来获得特定于站点的权限。正如我在每个站点的 LDAP 用户组中一样。 我想说的是,站点和组织角色并不像他们的名字所显示的那样工作。想一想:您可以将站点分配给常规角色,但不能为站点角色选择站点。 在 Liferay 6.1 中,您可以将用户的站点角色分配给站点。这不是一个常规角色。常规角色是门户范围的角色。这工作正常。似乎不起作用的是将站点角色分配给用户组,并且此站点角色是工作流配置的一部分,权限不会传播。 好吧,在您的情况下,看起来 UserGroup 到 SiteRole 的分配没有传播。我理解你的意思,但恐怕我不能就此提出一个“干净”的解决方案,除了提出一些解决方法 好的,明白了。然后我将尝试使用一个钩子来修复它,定期将站点角色添加到具有站点角色的用户组的成员中。谢谢大家的建议。

以上是关于Liferay 6.1中如何从用户组继承站点角色权限给他们的成员?的主要内容,如果未能解决你的问题,请参考以下文章

如何通过 Liferay API 获取组织和站点角色列表

无法将 portlet [portletname] 的角色与角色名称 [rolename] liferay 6.1 链接

Liferay 获取组织角色的所有用户(按组织角色名称)

在 Life ray 中自定义站点管理员角色的权限?

我们如何在 liferay7 中覆盖 liferay 模块?

Liferay 7:是不是可以自动从链接站点获取图像到站点地图?