Tag Archives: Zend Framework

Programa Dilleri ve Çatıları

Zend_Auth ile Kimlik Doğrulama İşleminin Gerçekleştirilmesi

Zend_Auth, Zend Framework’un oldukça kullanışlı kütüphanelerinden birisidir. Çeşitli kimlik doğrulama servislerine sağladığı destekle projenizin kimlik doğrulama mekanizmasını hızlıca biryerden biryere taşıyabilmenize olanak sağlar. Örneğin Zend üzerinde geliştirdiğiniz intranetinizin kimlik doğrulama işlemini Zend_Auth_Adapter_DbTable kullanarak veritabanındaki kullanıcı kayıtları üzerinden gerçekleştirirken, küçük bir geliştirme ile kimlik doğrulama operasyonunuzu şirketinizdeki LDAP sunucusu üzerine taşıyarak, uygulamanızı firmanızdaki e-posta hesapları, domain kullanıcıları ve IP telefonlar gibi sistemlerle aynı authentication servisini kullanarak kolayca yönetmeniz mümkündür.

Zend_Auth, bize aşağıdaki adaptörleri kullanarak kimlik doğrulama işlemi yapabilmemize olanak sağlar:

  • Zend_Auth_Adapter_DbTable
  • Zend_Auth_Adapter_Digest
  • Zend_Auth_Adapter_Http
  • Zend_Auth_Adapter_Ldap
  • Zend_Auth_Adapter_OpenId

Yukarıdaki adaptörleri kullanabildiğiniz gibi sizler de Zend_Auth_Adapter_Interface arayüzüne tabi yeni bir adaptör yazarak kendi kimlik doğrulama servisinizi geliştirebilirsiniz.

Bugün, konuyu temel düzeyde anlatabilmek adına sizlerle veritabanı adaptörünü kullanarak kimlik doğrulama işleminin nasıl gerçekleştirildiğini inceleyeceğiz.

Kimlik Doğrulama İşleminin Zend_Auth_Adapter_DbTable kullanılarak Gerçekleştirilmesi:

Zend_Auth_Adapter_DbTable, kimlik doğrulama işleminin veritabanındaki bir tabloda yeralan kullanıcı kayıtlarını kullanarak gerçekleştirilmesini sağlar. İnşası sırasında bizden aşağıdaki konfigürasyon verilerini beklemektedir:

zendDb: Zend_Db_Adapter_Abstract tipindeki veritabanı bağlantısını içerir.

tableName: Bu parametre, kullanıcı kimlik verilerinin bulunduğu veritabanındaki tablonun adını içermelidir.

identityColumn: Bu alan kullanıcı adı veya e-posta adresi gibi uniq bir kimlik verisi içermelidir.

credentialColumn: Kullanıcı adı/parola şemasındaki kimlik doğrulama yapılarında bu alan, kullanıcı parolasını içermelidir.

credentialTreatment: Pek çok durumda kullanıcı parolasının farklı algoritmalarla şifrelenmesi istenir. Bu alanda şifrelemenin nasıl gerçekleştirileceği metin olarak belirtilir. (MD5(?) gibi)

Ben inceleyeceğimiz örneklerde MySQL tercih ettim. Sizler dilerseiniz, MonboDB, SQLLite veya başka bir veritabanı kullanabilirsiniz.

İlk olarak kullanıcı tablomuzu oluşturalım.

CREATE TABLE `intranet_users` (
`id` INTEGER  NOT NULL AUTO_INCREMENT, 
`username` VARCHAR(50) UNIQUE NOT NULL, 
`password` VARCHAR(32) NULL, 
`real_name` VARCHAR(150) NULL,
PRIMARY KEY (id));

Veritabanı bağlantımızı oluşturalım.

$db = Zend_Db::factory('Pdo_Mysql', array(
    'host'     => '127.0.0.1',
    'username' => 'webuser',
    'password' => 'xxxxxxxx',
    'dbname'   => 'myintranetapp'
));

Yeni bir Zend_Auth_Adapter_DbTable örneği oluşturarak konfigürasyon verilerini örneğin inşası sırasında parametre olarak gönderiyoruz.

$authAdapter = new Zend_Auth_Adapter_DbTable(
    $db,
    'intranet_users',
    'username',
    'password'
);

Kullanıcı adı ve parola bilgilerimizi adaptöre tanımlıyoruz.

authAdapter->setIdentity('myusername')
           ->setCredential('mypassword');

Oturum açıyoruz.

$auth = = Zend_Auth::getInstance();
$result = $auth->authenticate($authAdapter);

Kimlik doğrulama işleminin başarılı/başarısız olma durumunu kontrol ediyoruz.

if( $result->isValid() ) {
    //Oturum basariliyse birseyler yap.
} else {
    //Oturum basarisizsa birseyler yap.
}

Kullanıcımızın kimliğini doğruladık. Ancak bu yeterli değil. Kimlik doğrulamasının başarılı olması durumunda oturum bilgisinin isteğe bağlı olarak dosya sistemi, memory veya veritabanı gibi biryerde saklanması gerekmektedir. Zend_Auth objesi bu bilgileri kayıt etmek için varsayılan olarak PHP Session objesini kullanır. Sizler uygulamalarınızda oturum verilerini dilerseniz veritabanı, dosya sistemi veya Zend_Auth_Storage_Interface arayüzüne uygun kendi geliştireceğiniz farklı bir depolama alanında saklayabilirsiniz.

if( $result->isValid() ) {
    $storage = $auth->getStorage();
    $storage->write($authAdapter->getResultRowObject(array('username', 'real_name')));
} else {
    //Oturum basarisizsa birseyler yap.
}

Projenizin herhangibir yerinde oturum durumunu kontrol etmek isterseniz:

$auth = Zend_Auth::getInstance();
if($auth->hasIdentity()) {
  echo $auth->getIdentity();
}

Oturumu sonlandırmak isterseniz:

$auth = Zend_Auth::getInstance();
$auth->clearIdentity();

Zend_Auth kütüphanesini temel düzeyde inceledik. Sizler de bu kütüphaneyi kolayca uygulamalarınıza uyarlayabilirsiniz. Zend_Auth ile ilgili daha fazla bilgi edinmek için http://framework.zend.com/manual/1.12/en/zend.auth.html sayfasını ziyaret edebilirsiniz. Bu blog yazısı ile Zend_Auth kütüphanesini kullanabileceğinizi düşünüyorsanız, diğer kimlik doğrulama adaptörlerinin kullanımı, yeni bir kimlik doğrulama adaptörünün geliştirilmesi ve diğer session storage adaptörlerinin kullanımı konularını incelemenizi öneririm.

Programa Dilleri ve Çatıları

Pratik Zend Config Kullanımı

Zend framework ile proje geliştirirken konfigürasyon dosyalarını okumak için sıklıkla kullandığım kütüphanemin kaynak kodlarını sizlerle paylaşmak istedim.

MyVendor/Config.php :

_config ) ) {
            $this->_config[$key] = $this->_getAdapter($fileName, $section);
        }

        return $this->_config[$key];
    }

    /**
     * returns file extension.
     * @param string $fileName
     * @return string
     */
    private function _getExtension($fileName)
    {
        $explodedFileName = array_reverse(explode('.', $fileName));
        $extension = reset($explodedFileName);
        return ucfirst($extension);
    }

    /**
     * returns reader adapter.
     * @param string $fileName
     * @param string $section
     * @throws MyVendor_Config_Exception
     * @return Zend_Config_Json|Zend_Config_Xml|Zend_Config_Ini|Zend_Config_Yaml
     */
    private function _getAdapter($fileName, $section = null)
    {
        $extension = $this->_getExtension($fileName);
        switch($extension) {
            case self::FILE_TYPE_JSON:
                return new Zend_Config_Json($fileName, $section);
            case self::FILE_TYPE_XML:
                return new Zend_Config_Xml($fileName, $section);
            case self::FILE_TYPE_INI:
                return new Zend_Config_Ini($fileName, $section);
            case self::FILE_TYPE_YAML:
                return new Zend_Config_Yaml($fileName, $section);
            default:
                throw new MyVendor_Config_Exception('Unknown file type:' . $extension, '');
        }
    }
}

MyVendor/Pattern/Singleton.php :

MyVendor/Config/Exception.php :

Örnek Kullanım:

loadFromFile($file, APPLICATION_ENV);