如何在Web应用程序的控件级别上解析网页内的权限?

时间:2011-08-14 19:40:43

标签: web-applications permissions security

我经常遇到要求Web应用程序中的控制级权限的客户端。因此,一个角色可以“创建”和“更新”,其他角色只能“更新”。现在,这不是一个真正的安全问题,大多数Web安全框架都使用过滤器并可以控制Web应用程序中的不同操作。由于每个按钮触发不同的操作,因此可以阻止用户调用他不应执行的操作。

真正的问题在于视觉层面。只要看到错误的按钮,他就会收到“未经授权的操作”消息。我需要根据他的权限向不同的用户显示不同的控件子集。现在,我通常为单独的配置文件创建单独的页面,但这意味着很多重复。是否存在解决此问题的任何Web框架(无论是哪种技术)?

4 个答案:

答案 0 :(得分:1)

大多数框架应该允许您在呈现时查询用户的权限(功能,无论如何),甚至可以从模板中查询。像这样:

<*pseudocode* if EditPermission.providedBy(user) >
    <button ...EDIT... />
<*pseudocode* end>

答案 1 :(得分:0)

我认为大多数基于MVC模式的框架都允许您为不同的角色提供不同的视图。因为代码与View分离,所以更容易在不同的地方和情况中重用该逻辑。尝试在Web表单样式应用程序中执行此操作会导致大量重复,因为运行页面的代码更紧密地绑定到页面。

如果您处于Web表单状态,则可以在矩阵中使用控件(或操作)而不是复制页面,其中用户角色显示哪些控件可用于哪些角色。当页面加载时,您可以根据用户所在角色矩阵中的内容隐藏/显示或启用/禁用控件。

答案 2 :(得分:0)

我在Perl和PHP中使用了一些MVC框架,他们的工作方式相同:他们可以让您随意构建自己的视图。但他们都不建议对不同的角色使用不同的视图。由于角色通常是权限组,因此制作单独的视图会阻止任何角色的创建或修改。因此框架建议制作一个独特的视图,并在视图中检查权限,就像在控制器中一样。它也避免了重复,尽管视图更复杂。

PHP中的几个例子,网络的通用语

  1. Symfony(ACL)

    //这应该在控制器中 $ securityContext = $ this-&gt; get('security.context'); //在视图中,添加“更新”按钮之前 if(false === $ securityContext-&gt; isGranted('EDIT',$ stuff)){     // ...

  2. Yii(RBAC)

    //在视图中 if(Yii :: app() - &gt; user-&gt; checkAccess('create')){     echo $ form-&gt; linkBut​​ton(...); } 如果(     YII ::应用程序() - &GT;用户&GT;的checkAccess( '更新')     || Yii :: app() - &gt; user-&gt; checkAccess('updateOwn',$ stuff) ){

  3. 请注意,许多组件(尤其是表单)通常不直接以HTML格式构建。因此,根据权限禁用某些元素比在模板中更容易。

答案 3 :(得分:0)

我也遇到了问题,我使用Zend Framework解决了这个问题。您不必使用完整的Framework本身,但可以依赖Zend_Acl - 框架的授权部分。

您基本上可以定义您的角色层次结构和每个角色的允许/拒绝操作,您可能已经从其他框架中了解到这些操作:

$acl = new Zend_Acl();

// two roles
$acl->addRole(new Zend_Acl_Role('moderator'))
    ->addRole(new Zend_Acl_Role('member'));

// a Resource is something you can map actions to
$acl->addResource(new Zend_Acl_Resource('database'))
    ->addResource(new Zend_Acl_Resource('database'), 'update');

// now for the acls itself
$acl->allow('moderator', 'database', 'update')
    ->deny('member', 'database', 'update');

如果您知道要根据角色显示或隐藏操作,就像在代码中使用isAllowed() - 方法一样简单:

// show button?
if ($acl->isAllowed($user->role, 'database', 'update')
    echo '<input type="button" value="update" />';
else
    echo '<input type="button" value="update" disabled="disabled" />';

手册页提供了对Zend_ACL()Zend_Auth()的更好洞察 - 后者提供了身份验证部分。如果您还希望根据角色生成menupoints更多的自动化,请查看Zend_Navigation