gpt4 book ai didi

php - 需要指导以开始使用 Zend ACL

转载 作者:IT王子 更新时间:2023-10-29 01:12:18 26 4
gpt4 key购买 nike

我目前正在一个需要 ACL 的网站上工作,并且由于我使用的是 Zend,所以使用他们的 ACL 类对我来说很有意义,但我对如何执行此操作知之甚少。我已经阅读了文档,但它让我更加困惑......基本上我想要做的就是设置两个用户组,例如"normal"和 "admin",普通用户可以访问所有 Controller 不是 admin 的页面,而 admin 显然可以访问 admin Controller 页面。

我有很多问题:

  1. 我该如何设置?
  2. 我应该通过数据库还是 config.ini 来运行它?
  3. 我应该把 ACL.php 放在哪里?
  4. 如何编写这样的脚本?
  5. 然后我该如何调用,这是在索引中完成的吗?

如果您能指导我访问一个网站或一个好的教程,我将不胜感激。

最佳答案

不久前我实现了类似的东西。示例代码中遵循基本概念。

我创建了自己的 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com