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)
希望有所帮助.
是的,在大多数情况下,您的所有身份验证都应该通过同一个控制器.但是,Zend Auth不是控制器类型.Zend Auth是一个使用常见身份验证方法(如数据库或http)的API.它的工作实际上只是成为编写身份验证代码的繁琐工作的包装器.
您正在寻找Zend Acl来区分普通用户和特权用户.在用户进行身份验证并登录后,您只涉及Zend Acl.
您需要的大部分内容都在ZF文档中.在对我有意义之前,我几乎阅读了Auth和Acl的所有文档.尽管ZF的Auth,ACL,Storage_*和其他类非常紧密地结合在一起,但它们都具有非常不同的用途.有一点时间你会发现它们很好地相互依赖.
一些可以帮助您入门的链接:
我能理解为什么你会感到困惑.我还是有点困惑.所以,遗憾的是我不能直接回答你的问题.但是,为了澄清我头脑中的所有这些东西,我正在做的一件事是用"域对象"而不是数据库记录来思考.
我处理这个问题的策略是创建我自己的Auth Adapter,它传递一个'User Base Object'和用户凭据.我的"用户群"有点像用户的存储库.
所以Zend Auth仍然是其他Zend组件的"接口",而我仍然可以更好地控制我的系统来存储和访问"用户".我的User_Base类可以是Zend Db tbl的包装器,或者甚至只有一些我可用于测试的硬代码.
所以一般来说 -
设计自己的'用户'模型
设计您自己的Auth适配器 - 从此处概述的最低接口开始:http: //framework.zend.com/manual/en/zend.auth.html
只是保持简单,慢慢来了解更多信息.
那就是我要做的事情.
我甚至不打算使用Zend ACL,直到我的头脑中有Auth清晰.
我正在修改遗留站点并将其转换为Zend MVC
这些是我必须要处理的"模型"工作的一些事情(可能是非常规的).:
好吧,我开始絮絮叨叨....但你明白了.不要让你看到的Zend_Auth + Zend Db教程影响你自己的模型.它们只是简化的例子.
努夫说