添加不同级别php的新用户的最佳方式

时间:2013-04-16 08:41:48

标签: php sql

我已经在PHP中创建了一个具有用户和用户具有不同级别的应用程序,只需说1,2,3,4。当用户登录时,设置一个会话,其中包含其级别编号。应用程序根据用户级别显示不同的页面,如下所示:

if($role_level > 3)
{
    //Show something
}

现在我想创建一个添加用户部分,用户可以在其中添加新用户并从下拉(html选择)框中为他们定义角色。但他们只能定义一个比自己低的角色。我在想这样的事情:

<select>
    ("SELECT * FROM `roles` WHERE `roles_level` < $role_level)
    loop results into <options></options>
</select>

对此有何评论?更好的方法去做吧?以上是否会有情感?

6 个答案:

答案 0 :(得分:5)

您的想法似乎可行,但它不够灵活,因为它允许角色之间的单一直接层次结构。如果您需要分支角色怎么办?例如,您现在可以将“用户”,“发布商”,“审核人”和“管理员”作为当前的1,2,3和4。

用户只能阅读文章,发布商也可以撰写和编辑自己的文章,审稿人也可以编辑其他发布商的文章,管理员也可以进行管理工作。

如果您想要主持人角色怎么办?主持人可以编辑任何人的文章,但不能编写新文章。你会如何实现?你无法使用当前的模型。

我建议你定义一个“角色”表,一个“动作”表,以及它们之间的N-M关系表:

角色:

  • 1,用户
  • 2,出版商
  • 3,评论员
  • 4,admin
  • 5,article_moderator

操作:

  • 1,read_post
  • 2,write_post
  • 3,edit_own_post
  • 4,edit_others_post
  • 5,administrative_tools

Roles_Actions:

  • 1,1
  • 2,1
  • 2,2
  • 2,3
  • 3,1
  • 3,2
  • 3,3
  • 3,4
  • 4,1
  • 4,2
  • 4,3
  • 4,4
  • 4,5
  • 5,1
  • 5,4 (请注意,版主(5)不能write_own_post甚至edit_own_post但只能编辑edit_others_post)

当然,这更复杂,但未来更灵活

我建议你也阅读这个答案:LINK @Vyktor解释了ACL的概念,对大型项目很有用

答案 1 :(得分:2)

我认为STT LCU已经提供great answer,但是出于学习目的(是的,这只是一个扩展)我想添加示例如何(并且已经完成) )在生产环境中,我最喜欢的例子是Zend Framework's Access Control Lists

他们指定三个单独的项目/对象/不确定如何调用它们:

  • 资源 - 你指的是什么,这可以是大件商品,例如ForumsNewsArticles。 ..或原子项,例如Forums_<forum_id>_others_posts_title。这应该取决于您期望的用户数量以及结构的复杂程度。如果您只有10个用户和一个管理员,那么您可以使用整个站点的一个资源。另一方面......想象一下,你是谷歌,有数以千计的应用程序在你的控制之下,你想提出统一和集中的ACL控制......很多很多资源。
  • 角色 - 这应该是自我解释的,但示例:BannedVisitorUserForumModeratorArticlesModeratorSiteAdministrator。在最佳框架(例如提到的Zend)中,您可以构建层次结构并继承角色之间的访问权限。
  • 访问控制 - Visitor can list list articles, but cannot read them ...这也是应该直观的事情,但这里有一点争议:
    • 使用层次结构 - 假设你指定了这个none < list < read < write < create < edit < delete这样的层次结构,并且让一个人自动将你们全部放到左边,例如写入会自动授予你阅读和列表。这很好,很直观......但是这个方法是没用的一个例子:黑盒子,你希望用户发布项目,但不要阅读它们。
    • 使用标记 - ** x chmod style *其中访问权限由flag确定:
      • 1 - 执行/列出目录的内容
      • 2 - 写
      • 4 - 阅读
        您可以在哪里使用二进制文件并检查访问权限:access&WRITE,或使用包含大量列的sql架构。

总结一下:你可以做很多事情,我真的建议阅读Zend的ACL,这样你就会感觉到API 可能的外观,也许你会发现一些你自己想不到的可能的缺点。

答案 2 :(得分:1)

如果你知道你将拥有所有可用的号码(即你不会去1,2,5,6,20),那么这样做会容易得多:

foreach(range(1,$role_level-1) as $level):
    echo "<option value='$level'>Level $level</option>";
endforeach;

而且,是的,您的想法将足以有效地执行基本权限系统。

答案 3 :(得分:1)

如果角色像你说的那样是静态的(1,2,3,4),那么我建议跳过额外的数据库命中,然后使用快速for循环!

<select>
<?php
for( $iRole = $role_level - 1; $iRole > 0; --$iRole )
    echo '<option value='.$iRole.'>'.$iRole.'</option>';
?>
</select>

否则,你似乎走在了正确的轨道上。

答案 4 :(得分:1)

好的,您可以拥有一个包含权限的表。如果级别数不是那么多,您还可以创建不同的数据库帐户。对不同部分的访问权限不同。

并且要小心你应该检查他/她想要做的人和事。我的意思是只显示一个选项是不够的,你应该检查服务器端的权限。

你可以像@STT LCU所说的那样创建行动和用户(角色)。

但这还不够,因为您需要一个代码或类似权限检查器。如果使用它,您可以检查权限,如。

if($perm->IsHaveAccess('editing_post')){
//the logic
}

答案 5 :(得分:1)

您的问题有一个非常好的解决方案。它是ACL(访问控制列表)。

有角色和资源,您可以访问它:)

有Zend网站的例子。

$acl = new Zend_Acl();

$acl->addRole(new Zend_Acl_Role('guest'))
    ->addRole(new Zend_Acl_Role('member'))
    ->addRole(new Zend_Acl_Role('admin'));

$parents = array('guest', 'member', 'admin');
$acl->addRole(new Zend_Acl_Role('someUser'), $parents);

$acl->add(new Zend_Acl_Resource('someResource'));

$acl->deny('guest', 'someResource');
$acl->allow('member', 'someResource');

echo $acl->isAllowed('someUser', 'someResource') ? 'allowed' : 'denied';

更多关于http://framework.zend.com/manual/1.12/en/zend.acl.introduction.html

我被教导说,如果有写的东西并且它很好并且有效,那么浪费时间去写一些新东西是没有意义的。

这些角色,资源和它们之间的关系,您可以保存在数据库中,只需在需要时加载它。

这是一个非常基本的例子,Zend_Acl为您提供了一个非常强大的工具,它取决于您如何使用它。如果您不想使用Zend Class,您可以查看它并以类似的方式设计您的课程。