2010-07-26 137 views
1

我在一个大项目上工作很有趣,原因很难说是正确的,它基于Joomla! (我不打算批评,Joomla!很棒,只是不适合我目前面临的任务),并且当我搜索确定当前登录用户是否为Admin的方式时,我发现一篇文章相当多大胆建议使用下面的代码:Joomla - 确定登录的用户是否是管理员

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

对我来说,这看起来像检查Admin用户的一个相当奇怪的方式。我将不胜感激$user->isAdmin()方法来做到这一点,而不是一对硬编码的字符串。

我无法找到一个更优雅的解决方案来检查Joomla中的管理员用户!框架。谁能帮忙?

+0

$ USER = JFactory ::的getUser();非常优雅。您可以用两行代码测试所有九种类型的用户(包括四种管理员)。另外,在大多数情况下,$ user已经被调用,你只需要输入你的第二行代码。伤心地看到Joomla在1.6 + – pathfinder 2012-11-27 07:10:39

回答

3

其实之前所述,随着访问级别是在的Joomla hard coded into the database! 1.5,这个字符串比较可能会失败的唯一方法是有人故意在其中加入新组。可以在.ini文件中更改字符串(以便非英语版安装仍然使用数据库中的英文单词 - 对于插件或组件的名称等其他表不适用)。

您可以获得组ID通过JFactory::getACL(),然后$acl->getGroupsByUser($userid, false)(见docs),但假设更大的ID意味着更大的特权,也似乎有点hacky(虽然对于标准安装也是如此)。

除此之外,你可以接管一个Joomla!能力:更明确地定义“管理员用户”是什么:可以安装新软件的人员?谁可以改变系统的配置?只需作出合理的假设,即与您希望他以管理员用户身份执行的操作相关的内容,将其用于authorize()通话(请参阅docs),并且可能会将其记录在您的界面中。

唯一干净的解决方案(我知道的)将是为ACL授权查找定义新条目(目前仅在php中实现,而不是在SQL中实现)。这是确保它成为Joomla的唯一方法! 1.6证明,其中自定义用户组将成为可能(并且管理员用户可以选择将授权授予用户组)。例如:

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

然后我们又有了硬编码的组名。好。

+0

确实很好的答案。谢谢。 – 2010-08-07 18:08:47

+0

据我所知,JFactory :: getACL()返回一个JAuthorization实例,它没有getGroupsByUser()方法... http://api.joomla.org/Joomla-Framework/User/JAuthorization.html – 2012-01-10 09:09:41

2

彼得,

我同意对的Joomla情绪,我们在这里使用.NET/PHP以及和有被开始的Joomla由于一些未知的原因,一些项目!

amnyway,另一种更细粒度的方法可能是检查用户是否具有实际的权利,而不是将它们作为suoper管理员等等,你可以得到大致如下这些信息:

$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>"; 
    } 

我知道它仍然是硬编码的,但至少它是用户特定的,而不是特定的特权。但是这种方法可以让你针对特定的“组件”相关特权,所以对你可能有用。

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

jim

+0

欢呼声中离开这里,吉姆。我只是看着authorize()函数,但它不是我所需要的。我经常需要特别检查唯一的超级管理员,然后过滤或不过滤后端管理面板中的一些条目。我经常需要检查登录用户是“超级管理员”还是“管理员”。 – 2010-07-26 11:34:59

+0

彼得 - 在这种情况下,搜索继续:) – 2010-07-26 11:42:33

+0

我想我将不得不提供一个赏金:-)但只有一个非常小的 – 2010-08-03 12:01:37

0

以下可能是对Joomla的破解。我尝试过,并得到了工作。

以会话的情况下

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

这会给用户登录你的类型可以在任何条件语句

+0

抱歉,但我知道如何到达当前用户的usertype属性,如你所愿在问题本身中已经注意到: $ user =&JFactory :: getUser(); if($ user-> usertype == ... 但是,这仍然只返回用户类型的字符串表示,然后我必须做字符串比较... – 2010-08-04 10:57:10

-1

使用这个如果乌拉圭回合的Joomla管理员用户名是admin然后ü可以使用下面的代码aspeter

$user =& JFactory::getUser(); 
if($user->usertype == "Super Administrator" && $user->username == "admin") 
{ 
    //... do what ever 
} 
+0

哦,不,不,不。就像这样的外观一旦有人配置管理员使用不同的名称,整个应用程序将在各个地方中断,另外,建议将默认管理用户名更改为生产系统的其他名称 – 2010-08-05 08:59:48

+0

抱歉Peter,即时消息也是新手,我只是建议,感谢更新我的知识 – JustLearn 2010-08-05 12:12:57

+0

更好的是,使用管理员用户只能创建另一个超级管理员用户,并停用第一个。这就像重命名管理员 - 文件夹(这是不太容易做到)保持90%的轻松攻击 – giraff 2010-08-07 10:04:00

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的以下快照每个用户组中的数据库:

Snapshot here

相关问题