1

我在一个基于 Joomla 的大项目上工作时获得了很多乐趣,但原因难以证明!(我并不是要批评,Joomla!很棒,只是不适合我目前面临的任务)当我用谷歌搜索确定当前登录用户是否是管理员的方法时,我发现了一个帖子相当大胆地建议使用以下代码:

$user =& JFactory::getUser();
if($user->usertype == "Super Administrator" || $user->usertype == "Administrator"){ ... }

对我来说,这看起来是一种相当奇怪的检查管理员用户的方式。我希望有一种$user->isAdmin()方法可以做到这一点,而不是几个硬编码的字符串。

我找不到更优雅的解决方案来检查 Joomla 中的管理员用户!框架。任何人都可以帮忙吗?

4

5 回答 5

3

实际上,由于访问级别被硬编码到Joomla的数据库中!1.5,这种字符串比较可能失败的唯一方法是有人故意将新组侵入其中。可以在 .ini 文件中更改字符串(以便非英语安装仍然使用数据库中的英语单词 - 对于其他表,例如插件或组件的名称,这不是真的。)

您可以通过, 然后(请参阅docs )获取组 ID,但假设更大的 id 也意味着更大的权限,这似乎也有点 hacky(尽管对于标准安装来说确实如此)。JFactory::getACL()$acl->getGroupsByUser($userid, false)

除此之外,您可以接管 Joomla!能力:更明确地定义,什么是“管理员用户”:可以安装新软件的人?谁可以更改系统的配置?只需做一个合理的假设,与您希望他作为管理员用户做什么相关的事情,在authorize()-Call 中使用它(请参阅文档),并可能在您的界面中记录它。

唯一干净的解决方案(据我所知)是为 ACL-authorize-lookuptable 定义新条目(目前仅在 php 中实现,而不是在 SQL 中实现)。这是确保它是 Joomla 的唯一方法!1.6 证明,可以自定义用户组(因此管理员用户可以选择是否将此授权授予用户组)。例如:

$acl =& JFactory::getACL();
$acl->addACL('{com_nameOfExtension}', '{action}', 'users', 'super administrator');
$acl->addACL('{com_nameOfExtension}', '{action}', 'users', 'administrator');

我们又得到了它们,硬编码的组名。好。

于 2010-08-05T20:50:12.107 回答
2

彼得,

我同意 joomla 的观点,我们在这里也使用 .net/php,并且有一些项目出于某种未知原因在 joomla 上启动!

无论如何,另一种更细粒度的方法可能是检查用户拥有的实际权限,而不是他们是超级管理员等。您可以通过以下方式获取此信息:

    $user =& JFactory::getUser();

    if ($user->authorize('com_content', 'edit', 'content', 'all')) {
            echo "<p>You may edit all content.</p>";
    } else {
            echo "<p>You may not edit all content.</p>";
    }

    if ($user->authorize('com_content', 'publish', 'content', 'own')) {
            echo "<p>You may publish your own content.</p>";
    } else {
            echo "<p>You may not publish your own content.</p>";
    }

我知道它仍然是硬编码的,但至少它是特定于用户的,而不是特定于特权的。但是,这种方法确实允许您针对特定的“组件”相关权限,因此可能对您有用。

我会跟踪回复,看看是否有一个“正确”的答案,因为它肯定是一个遗漏。

吉姆

于 2010-07-26T11:28:45.267 回答
0

以下可能是对 Joomla 的破解。我试了一下,成功了。

以会话为例

$_SESSION[__default][user]->usertype;

这将给出登录用户的类型,您可以在任何条件语句中使用它

于 2010-08-04T09:22:56.740 回答
0

您可以使用 getUser() 函数检查登录用户的“分配的用户组”。

$user =& JFactory::getUser();

$assigned_usergroups = $user->groups; // Array of assigned User Group

    if (in_array(8, $assigned_usergroups)) {
        echo "Super Admin";
    }

    else if (in_array(7, $assigned_usergroups)) {
        echo "Admin";
    }

    else {    
        echo "Other"; //Any of Guest/Public/Others
    }

您可以看到数据库中每个用户组的 Joomla 预定义 ID 的以下快照:

快照在这里

于 2016-01-29T07:09:48.277 回答
-1

如果您的 joomla 管理员用户名是,admin那么您可以使用之前描述的以下代码 aspeter

$user =& JFactory::getUser();
if($user->usertype == "Super Administrator" && $user->username == "admin")
{
  //... do what ever
}
于 2010-08-05T03:51:20.817 回答