Ben çok uzun zaman önce benzer bir şey uygulanmaktadır. Temel kavram bir örnek kod izler.
Ben, önyükleme dosyasında yüklü benim durumumda index.php benim kendi configAcl.php dosyası oluşturdu. İşte bu durumda uygun olurdu nasıl:
$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);
Tüm denetleyicileri normal kullanıcı sadece "liste" eylem izin vermek istiyorsanız başka bir durumdur. Bu oldukça basit, böyle satır eklemek istiyorum:
$acl->allow('normal', null, 'list'); // Has access to all controller list actions.
Sonra bazı denetleyici eylem için bir istek olduğunda otomatik olarak kontrol kimlik ilgilenir yeni eklenti oluşturmak gerekir. Bu kontrol kontrolör her eylem çağrısı önce denir preDispatch () yöntemiyle gerçekleşir.
İşte AuthPlugin.php olduğunu:
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('/');
}
}
}
}
Final adımlar configAcl.php yükleme ve önyükleme dosyası (muhtemelen index.php) olarak AuthPlugin kayıt edilir.
require_once '../application/configAcl.php';
$frontController = Zend_Controller_Front::getInstance();
$frontController->registerPlugin(new AuthPlugin());
Yani bu temel kavramdır. Ben yukarıdaki kodu test vermedi (kopyalama ve yapıştırma ve sadece vitrin amaç için yeniden) bu yüzden kurşun geçirmez değil. Sadece bir fikir vermek için.
EDIT
Netlik için. AuthPlugin yukarıda kod $ kimlik nesnesi (veritabanı "rol" sütunu) kullanıcı verileri ile dolu olduğunu varsayalım. Bu, böyle giriş süreci içinde yapılabilir:
[...]
$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);
[...]