Zend_Auth主要用來認證身份,Zend_Auth可以經由authenticate方法傳入特定的Auth Adapter(例如Zend_Auth_Adapter_Ldap或Zend_Auth_Adapter_DbTable),以便控制與哪方面的身份資料介接
LDAP Auth
application.ini(只列出LDAP設定檔部份)
..... [ldap] ldap.master.host = "ldap.com" ldap.master.port = "636" ldap.master.username = "uid=webauth,ou=netgroup,dc=test,dc=org,dc=tw" ldap.master.password = "123" ldap.master.bindRequiresDn = true ldap.master.baseDn = "dc=test,dc=org,dc=tw" ldap.master.useSsl = true .....
LoginController.php
$params = $this->_request->getParams();
//建立Zend_Auth Instance
$auth = Zend_Auth::getInstance();
//自訂session namespace,預設的namespace為Zend_Auth
$auth->setStorage(new Zend_Auth_Storage_Session('TEST'));
//設定timeout(秒)需要再透過Zend_Session
$authSession = new Zend_Session_Namespace('TEST');
$authSession->setExpirationSeconds(100);
//判斷是否有Identity(已登入)
if ($auth->hasIdentity()) {
$this->_redirect('/');
}
if (!empty($params['account']) && !empty($params['passwd'])) {
//讀入application.ini LDAP的設定檔
$config = new Zend_Config_Ini(dirname(__DIR__) . '/configs/application.ini', 'ldap');
//ldap server可以設定為多台
$ldap = $config->ldap->toArray();
//建立LDAP的Auth_Adapter
$adapter = new Zend_Auth_Adapter_Ldap($ldap, $params['account'], $params['passwd']);
$result = $auth->authenticate($adapter);
//取得LDAP的Auth_Adapter log
print_r($result->getMessages());
//取得result code
/*
result code分類
Zend_Auth_Result::SUCCESS
Zend_Auth_Result::FAILURE
Zend_Auth_Result::FAILURE_IDENTITY_NOT_FOUND
Zend_Auth_Result::FAILURE_IDENTITY_AMBIGUOUS
Zend_Auth_Result::FAILURE_CREDENTIAL_INVALID
Zend_Auth_Result::FAILURE_UNCATEGORIZED
*/
$code = $result->getCode();
//登入判斷
if (Zend_Auth_Result::SUCCESS === $code) {
//透過Auth_Storage可以寫入自行定義資訊
$storage = $auth->getStorage();
$storage->write(array('A'=>'Johnson','B'=>'Maple'));
$this->_redirect('/');
} else {
echo "Error Code:".$code;
}
}
IndexController
$auth = Zend_Auth::getInstance();
//設定name space
$auth->setStorage(new Zend_Auth_Storage_Session('TEST'));
//取得Identity值
print_r($auth->getIdentity());
//清空Identity(登出)
$auth->clearIdentity();
注意,因為Zend_Auth只用來做身份認證,所以如果要取得LDAP裡的其他資訊,請使用Zend_Ldap
DB Auth
application.ini
resources.db.adapter = "PDO_MYSQL" resources.db.params.dbname = "" resources.db.params.host = "localhost" resources.db.params.username = "" resources.db.params.password = "" resources.db.params.driver_options.1002 = "SET NAMES utf8" resources.db.isDefaultTableAdapter = true
controller
$dbAdapter = Zend_Db_Table::getDefaultAdapter();
$auth = Zend_Auth::getInstance();
//DB Auth
$authAdapter = new Zend_Auth_Adapter_DbTable($dbAdapter);
//define column
$authAdapter->setTableName('table_name')
->setIdentityColumn('account_column')
->setCredentialColumn('passwd_column');
//DB中存的是MD5編碼,可以自動做密碼編碼後的驗證
->setCredentialTreatment('MD5(?)');
//define value
$authAdapter->setIdentity($account)
->setCredential($password);
$result = $auth->authenticate($authAdapter);