Zend Auth和ACL

Udd*_*ers 11 php authentication zend-framework login

我希望有些人可以帮助我一点点,我目前正在使用PHP框架开发我的第一个站点,该站点的一部分溢出到成员区域,这是我的混乱开始浮出水面,我想要的成员区域正常成员能够添加新评论并编辑自己的评论,简单到我可以根据会话中存储的用户名检查海报名称,我的困惑是区分"普通"用户和更高级别用户谁有能力删除和修改任何评论等,他们也应该能够访问该网站的管理部分.

我的问题是,所有用户都应该通过相同的Zend_Auth控制器登录,还是应该为每种类型的用户使用Zend_Auth分离控制器,还是可以使用Zend_Acl处理所有这些?任何帮助,建议,文章或教程都将非常感激.就个人而言,我认为Zend文档在某些类上有点原始.

提前致谢

sico87

lo_*_*fye 18

我推荐曼宁出版社出版的"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);
Run Code Online (Sandbox Code Playgroud)

在控制器中:

$acl->add(new Zend_Acl_Resource('news'))
->allow('defaultRole', 'news');
Run Code Online (Sandbox Code Playgroud)

默认情况下,一切都被拒绝,因此您不需要指定:

->deny('defaultRole', 'news', 'add');
Run Code Online (Sandbox Code Playgroud)

继续在Controller的代码中:

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

如果不允许用户的身份进行"新闻 - >添加",则会将其重定向到未授权的页面(假设您已经创建了这样的页面).

如果用户具有> 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');
}
Run Code Online (Sandbox Code Playgroud)

希望有所帮助.


Bar*_*rad 6

是的,在大多数情况下,您的所有身份验证都应该通过同一个控制器.但是,Zend Auth不是控制器类型.Zend Auth是一个使用常见身份验证方法(如数据库或http)的API.它的工作实际上只是成为编写身份验证代码的繁琐工作的包装器.

您正在寻找Zend Acl来区分普通用户和特权用户.在用户进行身份验证并登录后,您只涉及Zend Acl.

您需要的大部分内容都在ZF文档中.在对我有意义之前,我几乎阅读了Auth和Acl的所有文档.尽管ZF的Auth,ACL,Storage_*和其他类非常紧密地结合在一起,但它们都具有非常不同的用途.有一点时间你会发现它们很好地相互依赖.

一些可以帮助您入门的链接:

PádraicBrady的ZF教程

Zend关于ACL和MVC的DevZone文章


JW.*_*JW. 5

我能理解为什么你会感到困惑.我还是有点困惑.所以,遗憾的是我不能直接回答你的问题.但是,为了澄清我头脑中的所有这些东西,我正在做的一件事是用"域对象"而不是数据库记录来思考.

我处理这个问题的策略是创建我自己的Auth Adapter,它传递一个'User Base Object'和用户凭据.我的"用户群"有点像用户的存储库.

所以Zend Auth仍然是其他Zend组件的"接口",而我仍然可以更好地控制我的系统来存储和访问"用户".我的User_Base类可以是Zend Db tbl的包装器,或者甚至只有一些我可用于测试的硬代码.

所以一般来说 -

那就是我要做的事情.

我甚至不打算使用Zend ACL,直到我的头脑中有Auth清晰.


我正在修改遗留站点并将其转换为Zend MVC

这些是我必须要处理的"模型"工作的一些事情(可能是非常规的).:

  • 用户可以使用来自多个"用户群"的应用程序 - openID,旧用户表,新用户表,转瞬即逝的客人等
  • 客人的身份可能只是他们第一次到达时创建的哈希
  • 然而,遗留用户的身份可能由遗留用户表中的ID表示
  • users和user_accounts是分开的东西.不要试图将它们混合成一个概念因为它可能变得复杂.
  • 系统中可能有许多不同类型的帐户.即买方账户与卖方账户.Readers_Account与Writers_Account
  • 帐户'有'用户 - '主要帐户持有人','管理员超级用户'等
  • 用户和帐户之间的关系由"account_users"(所有用户群中所有用户的本地子集)表示
  • 角色arew附加到account_users(该特定帐户的用户).(与浮动的角色相对)
  • 不要害怕在服务器上有多个Zend应用程序来代表一个网站 - 例如管理员应用程序,成员应用程序,前端应用程序.
  • 不要害怕让这些应用程序使用存储在"共享模型"文件夹中的模型对象,其中唯一的模型代码与位于/ application/models/foomodel文件夹中的单个应用程序直接相关.
  • 每个应用程序可能都有自己的自定义Auth适配器
  • 管理员身份验证适配器可能只允许来自"管理员用户表"的用户,而前端应用程序的Auth适配器可能能够从来宾用户群,员工或成员用户群中对用户进行身份验证.
  • 可能是一种特殊情况,其中前端应用会话被清除并在成员登录时由成员会话重新呈现.
  • 每个webclient在任何时候每个应用程序一个用户对象(而不是尝试引用具有访客用户和成员用户的人 - 这太复杂了)
  • 每个用户每个应用程序一个会话(命名空间以避免与他们可能在该域上登录的其他应用程序冲突) - (而不是尝试同时引用"使用它的人"与访客会话和成员会话.那太复杂了)

好吧,我开始絮絮叨叨....但你明白了.不要让你看到的Zend_Auth + Zend Db教程影响你自己的模型.它们只是简化的例子.

努夫说