- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我目前正在一个需要 ACL 的网站上工作,并且由于我使用的是 Zend,所以使用他们的 ACL 类对我来说很有意义,但我对如何执行此操作知之甚少。我已经阅读了文档,但它让我更加困惑......基本上我想要做的就是设置两个用户组,例如"normal"和 "admin",普通用户可以访问所有 Controller 不是 admin 的页面,而 admin 显然可以访问 admin Controller 页面。
我有很多问题:
如果您能指导我访问一个网站或一个好的教程,我将不胜感激。
最佳答案
不久前我实现了类似的东西。示例代码中遵循基本概念。
我创建了自己的 configAcl.php 文件,该文件加载到引导文件中,在我的例子中是 index.php。根据您的情况,情况如下:
$acl = new Zend_Acl();
$roles = array('admin', 'normal');
// Controller script names. You have to add all of them if credential check
// is global to your application.
$controllers = array('auth', 'index', 'news', 'admin');
foreach ($roles as $role) {
$acl->addRole(new Zend_Acl_Role($role));
}
foreach ($controllers as $controller) {
$acl->add(new Zend_Acl_Resource($controller));
}
// Here comes credential definiton for admin user.
$acl->allow('admin'); // Has access to everything.
// Here comes credential definition for normal user.
$acl->allow('normal'); // Has access to everything...
$acl->deny('normal', 'admin'); // ... except the admin controller.
// Finally I store whole ACL definition to registry for use
// in AuthPlugin plugin.
$registry = Zend_Registry::getInstance();
$registry->set('acl', $acl);
另一种情况是,如果您想在所有 Controller 上只允许普通用户“列出”操作。这很简单,你可以像这样添加一行:
$acl->allow('normal', null, 'list'); // Has access to all controller list actions.
接下来,您应该创建一个新插件,该插件会在请求某些 Controller 操作时自动进行凭据检查。此检查发生在每次调用 Controller 操作之前调用的 preDispatch() 方法中。
这里是 AuthPlugin.php:
class AuthPlugin extends Zend_Controller_Plugin_Abstract
{
public function preDispatch(Zend_Controller_Request_Abstract $request)
{
$loginController = 'auth';
$loginAction = 'login';
$auth = Zend_Auth::getInstance();
// If user is not logged in and is not requesting login page
// - redirect to login page.
if (!$auth->hasIdentity()
&& $request->getControllerName() != $loginController
&& $request->getActionName() != $loginAction) {
$redirector = Zend_Controller_Action_HelperBroker::getStaticHelper('Redirector');
$redirector->gotoSimpleAndExit($loginAction, $loginController);
}
// User is logged in or on login page.
if ($auth->hasIdentity()) {
// Is logged in
// Let's check the credential
$registry = Zend_Registry::getInstance();
$acl = $registry->get('acl');
$identity = $auth->getIdentity();
// role is a column in the user table (database)
$isAllowed = $acl->isAllowed($identity->role,
$request->getControllerName(),
$request->getActionName());
if (!$isAllowed) {
$redirector = Zend_Controller_Action_HelperBroker::getStaticHelper('Redirector');
$redirector->gotoUrlAndExit('/');
}
}
}
}
最后一步是加载您的 configAcl.php 并在引导文件(可能是 index.php)中注册 AuthPlugin。
require_once '../application/configAcl.php';
$frontController = Zend_Controller_Front::getInstance();
$frontController->registerPlugin(new AuthPlugin());
所以这是基本概念。我没有测试上面的代码(复制粘贴和重写只是为了展示)所以它不是防弹的。只是提供一个想法。
编辑
为了清楚起见。 AuthPlugin 中的上述代码假设 $identity 对象填充了用户数据(数据库中的“角色”列)。这可以在登录过程中完成,如下所示:
[...]
$authAdapter = new Zend_Auth_Adapter_DbTable($db);
$authAdapter->setTableName('Users');
$authAdapter->setIdentityColumn('username');
$authAdapter->setCredentialColumn('password');
$authAdapter->setIdentity($username);
$authAdapter->setCredential(sha1($password));
$authAdapter->setCredentialTreatment('? AND active = 1');
$auth = Zend_Auth::getInstance();
$result = $auth->authenticate($authAdapter);
if ($result->isValid()) {
$data = $authAdapter->getResultRowObject(null, 'password'); // without password
$auth->getStorage()->write($data);
[...]
关于php - 需要指导以开始使用 Zend ACL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/545702/
如何将可为 null 的 guid (guid?) 转换为 guid?我的目的是将可为空的 Guid 列表转换为 Guid 列表。 最佳答案 使用??运算符: public static class
我正在尝试根据 jaro 距离给出的相似性对一组字符串进行聚类。我正在用 python 中的 JellyFish 计算它。我一直在努力弄清楚如何对数据进行聚类。我不是集群方面的专家,这是我第一次尝试弄
我正在寻找的是一种方法,它允许我在用户的浏览器中下载图像以备后用。图像将在鼠标悬停(悬停)事件上激活。问题是我不想只在用户悬停时才下载图像,因为它会产生不好的效果。它必须在网站加载时下载。 有什么建议
Closed. This question needs to be more focused。它当前不接受答案。
我有以下代码: SELECT * FROM ( SELECT p.ProductID, pc.Name, ISNULL(p.Color, 'Unco
再一次,我有一个关于 jQuery 的问题,但我正在尽我最大的努力学习,但有时教程并没有给我我需要的一切。 我正在尝试使一组选项卡起作用,但是,似乎没有任何效果.. 这是我正在使用的代码: HTML:
Guidance bootstrap validator 不适用于 nav nav-tabs help me 我创建了一个分为 4 个选项卡的表单,并将 Bootstrap 验证器添加到表单中以测试输
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 要求提供代码的问题必须表现出对所解决问题的最低限度理解。包括尝试过的解决方案、为什么它们不起作用,以及
这个问题不太可能帮助任何 future 的访问者;它只与一个小的地理区域、一个特定的时间点或一个非常狭窄的情况有关,这些情况并不普遍适用于互联网的全局受众。为了帮助使这个问题更广泛地适用,visit
我正在尝试使用 Akka Futures 读取多个文件并将每一行传递给可调用对象。我的可调用对象是特定文件的解析器。所以 people.txt 可能会填充 Person 类型的对象。每行可以包含超过
我正在寻求提高我的 javascript 的标准,因为我正在超越简单的 AJAX 形式,转向更丰富的交互,而且它很快就会失控。 关于如何编写正确的 javascript 的资源很多,很多最好的都来自
我正在导入一个包含多行的 Excel 文件。有些列是日期,我必须这样读取它们,但 Apache poi 无法正确读取单元格的格式。事实上,日期必须是 dd/MM/YYYY,但是当我有 04/13/20
我试图让爬虫在连续 3 次尝试后每次都找不到相关页面时“中止”搜索某个子域。提取页面的标题和文本后,我开始寻找正确的页面以提交到我的 solr 集合。 (我不想添加与此查询不匹配的页面) public
我计划使用 Python 制作一个桌面应用程序,以学习一些桌面概念。我打算使用 GTK 还是 Qt,我还没决定使用哪一个。 事实是:我想创建一个可以从命令行调用并使用 GUI 的应用程序。因此它对于
关闭。这个问题需要debugging details .它目前不接受答案。 编辑问题以包含 desired behavior, a specific problem or error, and th
我正在将一个低级 C 库转换为 Delphi。 我找到了很多类型转换。我认为这在 C World 中很正常。我想我把它们扔掉是安全的。整数仅在此处为 32 位。你怎么看? 如果我将它转换为对象等,OO
我已经能够为我的 Sprite 应用平滑的动画并使用加速度计控制它。我的 Sprite 固定沿着 x 轴左右移动。 从这里开始,我需要弄清楚如何为 Sprite 创建一条垂直的无限波浪线以尝试追踪。我
我使用的是 Ubuntu,如何指示 pip 使用 Python3 安装而不是 Python2.6? 2.6 是 Ubuntu 上的默认安装。我无法升级它,因为它会破坏 Ubuntu。 最佳答案 任何单
我可以使用 cs50 中的一些帮助来解决此问题。每当我的代码遇到 while 循环时,fread 函数就会返回 0。我似乎无法理解为什么会发生这种情况。即使在我遇到这个问题之前,我的代码也没有按照我的
我已经阅读了很多关于该主题的文章(包括 scrapy 文档),但出于某种原因我无法登录到 vBulletin 网站。让我澄清一下,我不是开发人员,我对编程/抓取的知识非常基础,所以如果有人决定提供帮助
我是一名优秀的程序员,十分优秀!