Zend_Acl и Zend_Auth api key подход

Какой хороший способ реализовать ключи API для доступа к конкретным действиям контроллера с помощью Zend MVC?

В настоящее время у меня есть Zend_Acl в сочетании с Zend_Auth с использованием файлов cookie сеанса, но я хочу, чтобы некоторые действия были закреплены, а пароль защищен с помощью Zend_Acl + Zend_Auth (обычно действие для чтения из базы данных и т. Д. Для обновления кеша).

Как я могу использовать Zend_Acl для отслеживания ключей api для входа в систему и считывать правильную идентификацию / роль из Zend_Auth на их основе?


person Jon Skarpeteig    schedule 29.08.2011    source источник
comment
Вы должны использовать скрипт командной строки для cronjobs   -  person Arnaud Le Blanc    schedule 29.08.2011
comment
Какую схему аутентификации вы используете? Коды аутентификации сообщений (например: HMAC, VMAC)? Что-то другое?   -  person netcoder    schedule 29.08.2011
comment
В настоящее время я просто использую имя пользователя / пароль, аутентифицированный по LDAP, с идентификатором, хранящимся в сеансе.   -  person Jon Skarpeteig    schedule 30.08.2011


Ответы (1)


Zend_Auth выполнит большую часть аутентификации за вас. Используйте что-нибудь вместе

$auth = Zend_Auth::getInstance();
if (!$auth->hasIdentity()) {
    //call a custom login action helper to try login with GET-params
}
if ($auth->hasIdentity())
    $identity = $auth->getIdentity(); 
    //...
}

Теперь вы можете определить Zend_Acl_Role на основе идентичности. Я всегда создаю новую роль для каждого пользователя и позволяю этой роли «наследовать» все общие роли, которые у пользователя есть на самом деле.

// specific user with $identity is given the generic roles staff and marketing
$acl->addRole(new Zend_Acl_Role('user'.$identity), array('staff', 'marketing'));

Конечно, вы можете получить массив ролей из базы данных. Затем вы должны указать права каждой роли. Вы можете жестко запрограммировать это или сохранить эту информацию в базе данных.

$acl->allow('marketing',
        array('newsletter', 'latest'),
        array('publish', 'archive'));

В вашем контроллере теперь вы можете проверить

$acl->isAllowed('user'.$identity, Zend_Acl_Resource ...)

Если у вас более сложный контроль доступа, где права зависят от информации внутри некоторых классов (возможно, моделей MCV), пусть эти классы реализуют Zend_Acl_Resource_Interface. Затем вы используете этот класс как параметр Zend_Acl_Assertion и обрабатываете там информацию.

person ACNB    schedule 23.01.2012