我已经在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>
对此有何评论?更好的方法去做吧?以上是否会有情感?
答案 0 :(得分:5)
您的想法似乎可行,但它不够灵活,因为它允许角色之间的单一直接层次结构。如果您需要分支角色怎么办?例如,您现在可以将“用户”,“发布商”,“审核人”和“管理员”作为当前的1,2,3和4。
用户只能阅读文章,发布商也可以撰写和编辑自己的文章,审稿人也可以编辑其他发布商的文章,管理员也可以进行管理工作。
如果您想要主持人角色怎么办?主持人可以编辑任何人的文章,但不能编写新文章。你会如何实现?你无法使用当前的模型。
我建议你定义一个“角色”表,一个“动作”表,以及它们之间的N-M关系表:
角色:
操作:
Roles_Actions:
当然,这更复杂,但未来更灵活
我建议你也阅读这个答案:LINK @Vyktor解释了ACL的概念,对大型项目很有用
答案 1 :(得分:2)
我认为STT LCU已经提供great answer,但是出于学习目的(是的,这只是一个扩展)我想添加示例如何(并且已经完成) )在生产环境中,我最喜欢的例子是Zend Framework's Access Control Lists。
他们指定三个单独的项目/对象/不确定如何调用它们:
Forums
,News
,Articles
。 ..或原子项,例如Forums_<forum_id>_others_posts_title
。这应该取决于您期望的用户数量以及结构的复杂程度。如果您只有10个用户和一个管理员,那么您可以使用整个站点的一个资源。另一方面......想象一下,你是谷歌,有数以千计的应用程序在你的控制之下,你想提出统一和集中的ACL控制......很多很多资源。Banned
,Visitor
,User
,ForumModerator
,ArticlesModerator
,SiteAdministrator
。在最佳框架(例如提到的Zend)中,您可以构建层次结构并继承角色之间的访问权限。Visitor can list list articles, but cannot read them
...这也是应该直观的事情,但这里有一点争议:
none < list < read < write < create < edit < delete
这样的层次结构,并且让一个人自动将你们全部放到左边,例如写入会自动授予你阅读和列表。这很好,很直观......但是这个方法是没用的一个例子:黑盒子,你希望用户发布项目,但不要阅读它们。flag
确定:
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,您可以查看它并以类似的方式设计您的课程。