php - Zend Auth 和 ACL

标签 php zend-framework authentication

我希望有人能帮我一点点,我目前正在使用 PHP 框架开发我的第一个网站,该网站的一部分溢出到成员(member)区,这是我的困惑开始浮出水面的地方,成员(member)区我希望普通成员能够添加新评论并编辑自己的评论,非常简单,我可以根据 session 中存储的用户名检查发帖人姓名,我的困惑来自于区分“普通”用户和能够删除和修改任何评论等的更高级别的用户,他们也应该能够访问网站的管理部分。

我的问题是所有用户都应该通过同一个 Zend_Auth Controller 登录,还是应该有针对每种类型的用户使用 Zend_Auth 的单独 Controller ,或者所有这些都可以使用 Zend_Acl 来处理吗?任何帮助、建议、文章或教程将不胜感激。我个人认为 Zend 文档在某些类上有些原始。

提前致谢

sico87

最佳答案

我推荐 Manning Publications 的“Zend Framework in Action”一书,作为对此的最新介绍。它以 PDF 格式下载,所以您现在就可以拥有它:)

但要回答这个特定问题:

让我们从定义两个关键术语开始。 Zend_Auth 中的“Auth”指的是身份验证,它证明某人是他们所说的人(即登录)。 Zend_Acl 中的“A”指的是授权,它证明某人有权做他们想做的事(即访问控制)。

假设用户只有一个角色... 将用户的角色存储在您作为 Zend_Auth 的一部分获得的“身份”中。 登录时:

$auth = Zend_Auth::getInstance();
$identity = new stdClass();
$identity->user_pk = $user->getPrimaryKey();
$identity->user_name = $user->getName();
$identity->role = $user->getRole(); // select * from user_role where user_pk=xxx
$auth->getStorage()->write($identity);

在 Controller 中:

$acl->add(new Zend_Acl_Resource('news'))
->allow('defaultRole', 'news');

默认情况下一切都被拒绝,所以你真的不需要指定:

->deny('defaultRole', 'news', 'add');

Controller 代码中的进一步内容:

$identity = Zend_Auth::getInstance()->getIdentity();
if(!$acl->isAllowed($identity->role, 'news', 'add'))
{
   header('Location: http://www.yoursite.com/error/unauthorized');
}

如果用户的身份不允许执行“新闻->添加”,它将把他们重定向到未经授权的页面(假设您已经制作了这样的页面)。

如果用户有 >1 个角色,您将在他们的身份中存储一组角色。 然后你的支票会是这样的:

$identity = Zend_Auth::getInstance()->getIdentity();
$isAllowed = false;
foreach($identity->role as $role)
{
   if($acl->isAllowed($role, 'news', 'add'))
   {
      $isAllowed = true;
   }
}
if(!$isAllowed)
{  // if NO ROLES have access, redirect to unauthorized page
   header('Location: http://www.yoursite.com/error/unauthorized');
}

希望对您有所帮助。

关于php - Zend Auth 和 ACL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/468863/

相关文章:

php - 如何解决: session_start(): Cannot send session cache limiter - headers already sent

php - 伊伊 : Error in defining an array

php - Codeigniter URI 路由和安全

php - 无法从 PHP 连接到 MySQL,但可以从远程计算机连接?

facebook - Zend 框架 : Meta property integration

performance - 存储 Web 应用程序登录用户信息的最佳方式是什么?

javascript - 使用javascript从磁条阅读器解析信用卡数据

php - Doctrine2 更新导致 Zend Framework 3 中 AnnotationRegistry registerLoader 错误

php - 使用 Zend_Auth 和 Zend_Session 管理用户

python - 需要 Scrapy 登录 vBulletin 指导