权限
Joomla拥有一个非常复杂的权限框架,如果您不熟悉它,则应首先查看一些入门资料。我建议您查看访问控制列表教程和视频Joomla 3 ACL 解释与 Randy Carey(2 分钟到 32 分钟是需要观看的部分)。这两者都与 Joomla 3 相关,但 ACL 在 Joomla 3 版本和 4 或 5 版本之间没有发生变化。
权限 - 实现视图
权限保存在 Joomla 的 #__assets
表中,位于 rules
列中。如果您安装的是干净的 Joomla,在 com_content
的 assets
记录中(即 name
列为“com_content”的记录),您将在 rules
列中找到类似于(但可能不完全相同)以下 json 字符串的条目
{"core.admin":{"7":1},"core.manage":{"6":1},"core.create":{"3":1},"core.edit":{"4":1,"2":1},"core.edit.state":{"5":1},
"core.execute.transition":{"6":1,"5":1},"core.delete":{"2":0}}
这意味着在 com_content
级别
- 对于“core.admin”权限,用户组“7”的值为 1(表示允许)
- 对于“core.manage”权限,用户组“6”的值为 1(允许)
- (接下来几个权限也类似)
- 对于“core.delete”权限,用户组“2”的值为 0(拒绝)
对于这些未指定用户组的权限,这意味着该值是继承的。
以上值反映了文章(权限选项卡)中通过系统配置设置的内容。
该图片显示了注册用户组的权限,在我的 Joomla 实例中,该用户组的用户组为“2”。我已设置权限,以便该用户组在以上 JSON 字符串中的权限为
- “core.edit” - 设置为 1 - 允许
- “core.delete” - 设置为 0 - 拒绝 其他权限未设置,因此这些权限默认为继承。
权限操作
这些是用户可以执行的操作类型。大多数操作不言而喻,但有些可能需要一些解释。
“core.admin” - 在组件配置级别描述为“配置 ACL 和选项”,在全局配置级别描述为“超级用户”。
在组件配置级别拥有“core.admin”权限但不在站点级别拥有该权限的用户可以执行与该组件相关的任何操作,但系统范围的操作将对他/她不可用。
在 Joomla 站点级别(即全局配置)拥有“core.admin”权限的用户完全不受限制,可以在整个站点执行任何操作。
“core.options” - 描述为“配置选项”或“仅配置选项”(取决于 Joomla 版本)。确定用户是否可以配置选项
- 在全局配置中(如果权限在全局级别)
- 对于单个组件(如果权限在组件级别)。
“core.manage” - 描述为“访问管理界面”。拥有此权限的用户可以访问管理员后端并执行较低级别的管理功能,例如签入项目。
资产层次结构
如图所示,资产保存在层次结构中,在 #__assets
表中以嵌套集结构实现。这使得可以在较高级别设置权限,然后将其向下传递到较低级别的项目。
对于 com_content
,最低级别是单个文章,然后向上依次为
- 文章的类别
- 该类别的父级(依此类推,直到最顶层的父级类别)
- com_content 权限
- 全局配置权限
Joomla 如何确定用户是否可以执行操作
让我们考虑一下 Joomla 如何检查用户是否可以编辑文章。以下是步骤(这些是逻辑步骤 - 实际代码的设计方式不同,以提高性能)
- 确定权限 - 在本例中,假设权限为“core.edit”
- 查找用户所属的所有用户组。这些将包括用户直接分配到的用户组或用户组,以及这些用户组的祖先。
- 获取文章的权限规则。例如,如果文章 ID 为 22,则这涉及查找名称为“com_content.article.22”的资产记录,并在
rules
字段中查找。 - 向上遍历资产表(使用
parent
字段)并获取所有祖先的权限规则。这将向上遍历与文章关联的类别的层次结构,通过com_content
权限,直到全局配置中设置的根权限。 - 在这些规则集中,为用户所属的每个用户组查找与“core.edit”相关的条目
- 如果找到一个规则,其中用户的某个用户组被分配了值 0(即拒绝),则不允许用户执行该操作。在资产层次结构的任何级别,对于用户所属的任何用户组(直接或间接),拒绝值都将意味着不允许用户执行该操作。
- 如果未找到任何用户的任何用户组的拒绝值,则如果至少有一个条目(允许)的值为 1(允许),则允许用户执行该操作。
- 如果在任何用户的任何用户组的任何资产层次结构规则中都没有条目,则不允许用户执行该操作。
在扩展中检查权限
Joomla不会神奇地应用权限规则来控制用户可以在扩展中执行哪些操作或不能执行哪些操作。您需要确定哪个权限字符串适合某个操作,并调用 Joomla 库函数来检查用户是否具有执行该操作的权限。
例如,要检查用户是否可以编辑文章(例如,ID 为 22),请使用
$user = Factory::getApplication()->getIdentity();
$allowed = $user->authorise('core.edit', 'com_content.article.22');
变量 $allowed
将设置为 true
或 false
,具体取决于用户是否允许执行该操作。
或者要检查用户是否可以创建联系人
$allowed = $user->authorise('core.create', 'com_contact');
如果您想在组件级别检查多个权限(例如,在组件视图中显示工具栏),则可以使用
use Joomla\CMS\Helper\ContentHelper;
…
$canDo = ContentHelper::getActions('com_example');
if ($canDo->get('core.create')) { // display New button
}
if ($canDo->get('core.delete')) { // display Delete button
} // etc