跳至主要内容
版本:5.1

Joomla 访问机制

Joomla 的项目,例如文章、联系人、菜单项等都具有一个访问字段,用于判断用户是否可以查看该项目。

访问字段的值称为“查看访问级别”,它基本上是一个具有关联名称的整数值;这些级别名称可以在管理员后端看到,方法是选择用户/访问级别。

在同一个表单中,您可以看到具有查看该级别的访问权限的用户组。管理员指定能够看到具有该访问级别的项目的用户组。

当管理员编辑用户记录时,他/她可以在“已分配用户组”选项卡中设置该用户所属的用户组。用户组具有层次结构(树)结构,因此如果用户属于另一个用户组的子组,则该用户也是父用户组的成员。

例如,使用默认的 Joomla 用户组,管理员用户组是管理器用户组的子组,因此分配了管理员用户组的用户也将自动属于管理器用户组。

Joomla Access levels

参考图表,假设用户属于用户组(列)A、C 和 D。用户可以直接分配给其中一个组,或者因为它是分配给用户的用户组的父链中的成员而属于它。

彩色菱形代表 Joomla 网站上的不同访问级别。

浅蓝色访问级别允许用户组 A、D 和 E 查看。

由于用户属于用户组 A 和 D,因此任何具有浅蓝色访问级别的项目都应该对该用户可见。

如果用户属于与访问级别关联的任何用户组,则该用户应该能够查看它。无论用户是否属于与访问级别关联的所有用户组都无关紧要。

红色访问级别仅允许用户组 E 查看。

由于用户不属于用户组 E,因此任何具有红色访问级别的项目都应该对该用户不可见。

遵循这种方法,您应该看到用户应该可以看到项目 5,但看不到项目 3 或 4。

编码方法

重要的是要了解,Joomla 不会神奇地应用访问规则来确保网站访问者只能看到他们应该被允许看到的内容。当您编写扩展代码时,需要遵循核心 Joomla 组件的示例,并将访问框架应用于您的扩展。Joomla 提供库函数,使您(以及核心 Joomla 组件和模块的开发人员)能够轻松地应用访问规则。

在代码中检查访问时,最简单的方法是使用 User::getAuthorisedViewLevels 函数

$user = Factory::getApplication()->getIdentity();
$levels = $user->getAuthorisedViewLevels();

getAuthorisedViewLevels 函数返回一个整数数组,这些整数是该用户应该被允许查看的访问级别的值。在上图中,访问级别用颜色表示,此数组将是用户被允许查看的颜色集合。

(顺便说一下,有时您会在 Joomla 代码中看到 $groups = $user->getAuthorisedViewLevels();,这会让人觉得该函数返回一个用户组数组,但事实并非如此,代码具有误导性。)

因此,要检查用户是否可以查看特定项目,请获取该项目的访问字段的值,并检查该值是否在 getAuthorisedViewLevels 返回的数组中,例如

$levels = $user->getAuthorisedViewLevels();
$canView = in_array($item->access, $levels);

但是,请注意,超级用户应该能够看到所有项目,无论访问级别如何,因此通常还有另一个检查

 if ($user->authorise('core.admin')) {
// this is a Super user – allow the user to view the item

如果用户无权查看项目,则您应该考虑如何最好地报告错误。

  • 如果用户已登录,您可能希望返回 HTTP 状态 403(禁止访问)。
  • 如果用户未登录,您可能希望返回状态 403,或者您可能希望将用户重定向到登录屏幕,并显示一条消息,要求用户登录才能查看该项目。

您可以通过检查用户对象的 guest 属性来查看用户是否已登录。例如,如果用户未登录,则返回带有“未授权”消息的 403

if ($user->guest) {
throw new \Exception(Text::_('JERROR_ALERTNOAUTHOR'), 403);
}