CakePHP Alternatif doğrulama kaynakları (LDAP)

3 Cevap php

Ben bir CakePHP proje üzerinde çalışıyorum ve şu anda bunun kullanıcı doğrulama kısmını inşa ediyorum. (: Şifreler yani) benim veritabanında saklanmaz - doğrulama kodlu LDAP ama benim soru olmayan herhangi bir veritabanı kaynağı için de geçerlidir sorun benim kimlik bilgileri olduğunu.

Onlar yerel veritabanında mevcut olduğunda Cake sadece şifreleri kolları gibi görünür. The Cake Cookbook suggests sen ancak (koduna bakarak, $this->Auth->authorize değişken kullanarak bir yetkilendirme prosedürü sağlamak için bunu farklı bir kontrolör / model / nesne söyleyebilirim ki özellikle the Auth::startup() fonksiyon ) it looks like Cake will always try to query the database first, daha sonra Auth->authorize. Yani değişen, ile belirtildiğinde alternatif nesneye bakarak önce, eşleşen kullanıcı adı / parola kontrol authorize Sadece bir saniye ekler -seviyesi filtre, bu veritabanı arama yerine geçmez.

// The process
1. User provides details
2. Cake checks the database
3. If OK, then check the custom object method
4. If OK, return true

// What I'd like:
1. User provides details.
2. Check the custom object method
3. If OK, return true
4. Profit.

Umarım çekirdek dosyaları hack olmadan bunu nasıl herhangi bir fikir?

3 Cevap

Eğer sadece LDAP karşı bağlayıcı ve MySQL kullanıcı veri alma / depolama varsayarsak, bu yaklaşım otomatik başarılı oturumları için hesapları yaratacak bir "köprü" olarak çalışacaktır:

// app/controllers/components/ldap_auth.php
<?php
App::import('Component', 'Auth');
class LdapAuthComponent extends AuthComponent {
/**
 * Don't hash passwords
 */
    function hashPasswords($data){
        return $data;
    }
/**
 * We will initially identify the user
 */
    function identify($user=null, $conditions=null) {
        // bind credentials against ldap
        $ldapUser = $this->_ldapAuth($user); // do your stuff
        if (!$ldapUser) {
            return null; // if bind fails, then return null (as stated in api)
        }
        // get the cake model you would normally be authenticating against
        $model =& $this->getModel(); // default is User
        // check for existing User in mysql
        $user = $model->find('first', array('conditions' => array(
            'username' => $ldapUser['cn']
        ));
        // if no existing User, create a new User
        if (!$user) {
            $user = $model->save(array('User' => array(
                'username' => $ldapUser['cn'],
                // .. map needed ldap fields to mysql fields ..
            )));
            if (!$user) {
                $this->cakeError('ldapCreateUser');
            }
            // pass the id of the newly created User to Auth's identify
            return parent::identify($model->id, $conditions);
        }
        // pass the id of the existing User to Auth's identify
        return parent::identify($user[$this->userModel][$model->primaryKey], $conditions);
    }
/**
 * Lets check LDAP
 *
 * @return mixed Array of user data from ldap, or false if bind fails
 */
    function _ldapAuth($user) {
        $username = $user[$this->userModel][$this->fields['username']];
        $password = $user[$this->userModel][$this->fields['password']];
        // use the php ldap functions here
        return $ldapUser;
    }
}
?>

instructions here, kullanmak uygulamanızda LdapAuth ile Auth tüm başvuruları değiştirmek veya izleyin.

Not rağmen _ldapAuth() yöntemi could bir LdapUser modeline dışarı soyutlanmış olması, ve bu model should bir {[okumak korumalı ( 4)]}, ve LDAP sunucusu bağlantı ayarları should database.php config olacak, ve LdapAuthComponent should kullanmak için adapte edilebilir yapılandırılabilir alanı eşleştirmeleri, bu "sadece halletmek" için gereksinimleri değil. :)

Auth::authorize gerçekten model veri için bir yedek değil, sadece o ekler.

5.2.6.10 authorize

Normalde, AuthComponent girdiğiniz oturum açma kimlik bilgileri kullanıcı modelinde saklanan ne bunları karşılaştırarak doğru olduğunu doğrulamak için çalışacaktır. Ancak, yapmak isteyebilirsiniz zamanlar vardır some additional work in determining proper credentials.

LDAP ayrıntılar modelde abstracted gerektiğini beri olduğunu, ancak bir sorun olmamalıdır. Kek hala kullanıcı adı ve şifre modelini kontrol edecek, ancak LDAP dizininden şeffaf verdiği yanıtları oluyor. Sadece model için bir LDAP datasource uygulamak gerekir. Belki de bu two articles başlamak alabilirsiniz.

Ben Kek nispeten tehlikeli bunu yapar yol etrafında kesmek başardı, ama muhtemelen kabul edilebilir bir yoldur.

(Eğer bir şey kullanabilirsiniz gerçi) benim kullanıcıların masanın üzerine bir "şifre" alanını ekledi ve "bir" herkesin şifre ayarlayabilirsiniz.

Sonra benim modele özel bir karma fonksiyonu eklendi:

function hashPasswords($data) {
    $data['User']['password'] = 'a';
    return $data;
}

Ve karma için bu modeli kullanmak benim denetleyicisi söyledi:

$this->Auth->authenticate = ClassRegistry::init('User');

Bu şimdi kekinin ilk adım her zaman (adı tabloda var varsayarak) geçecek demektir. authorize fonksiyonu şimdi onun bir şey yapmak ve istediğiniz ne olursa olsun yöntemi kullanarak doğru kontrol yapabilirsiniz.

Bu temelde bu süreci değişti:

// The process
1. User provides details
2. Cake checks the database **and always returns OK**
3. If OK, then check the custom object method
4. If OK, return true