YII + ldap + rights

Ciao a tutti!

Ho scritto una applicazione che sfrutta Rights per assegnare i permessi agli utenti.

Ora mi piacerebbe fare in modo da autenticare gli utenti, invece che a fronte del database, utilizzando l’LDAP aziendale. Ma a questo punto, come continuare ad utilizzare Rights?

C’è qualcuno che ha consigli su cosa conviene fare?

Saluti

Io ho creato un sistema misto. Effettuo l’autenticazione con protocollo LDAP (su AD) utilizzando la libreria adLdap. Una volta autenticato l’utente, inserisco (o aggiorno) un record su una tabella degli utenti. Poi utilizzo questa tabella insieme ad altre (authassignment, authitem, authitemchild, authitems) per la gestione delle autorizzazioni (ad esempio con Rights).

Sarebbe "bello" poter gestire il sistema di autorizzazione utilizzando, ad esempio, i gruppi Active Directory ma al momento non saprei come fare.

Penso che si debba gestire l’assegnazione e la revoca di ruoli/tasks/operation come descritto qui.

Se qualcuno ha delle proposte a riguardo interessa anche a me.

Come ti dicevo sto usando Rights e volevo trovare un meccanismo di integrazione tra Rights e LDAP.

L’integrazione vorrei farla a livello di Task (Ruoli) invece che a livello di singolo privilegio in modo da non impazzire ogni volta che cambio o aggiungo un permesso.

Rileggendo la documentazione di Rights ho scoperto a pag. 9:

[i]"Integration

Rights provide a couple of methods that allow for easy integration with your application. These methods

can be found within the Rights class under the components directory."[/i]

La cosa che mi viene in mente e che sto provando è quella di fare sublcass di RWebUser e fare override di




class RLdapWebUser extends RWebUser {


    [...]


    public function afterLogin($fromCookie) {

        // Qui andrebbe una query su LDAP tesa a determinare i ruoli

        // dell'utente (in $this->name trovo la username)

    

        if ($utente_ha_ruolo_o_permesso) {

            Rights::assign($nome_del_permesso, $this->id);

        } else {

            Rights::revoke($nome_del_permesso, $this->id);

        }

    }

}



Nel file di configurazione:




    [...]

    'user' => array(

        // enable cookie-based authentication

	'allowAutoLogin' => true,

	'class'=>'RLdapWebUser',

    ),

    [...]



Naturalmente questa è una primitiva e va perfezionata, però dovrebbe essere una delle possibili soluzioni al problema.

Ti faccio sapere dove arrivo…

Bruno

Prima di verificare l’esistenza di altre estensioni ho cercato di risolvere il problema da me. Ho modificato il componente UserIdentity, il resto lo fa RBAC. Di fatto se ldap funziona salvo l’utente nel database.


<?php


  class UserIdentity extends CUserIdentity {


    private $_id;


    public function authenticate() {

      $ldaprdn = "NOME_DOMINIO\\" . $this->username;

      $ldappass = $this->password;

      $ldapconn = ldap_connect("SERVER_LDAP:389")

              or die("Could not connect to LDAP server.");

      if ($ldapconn) {


        /* Se ho la connessione ldap controllo prima quella. */

        $ldapbind = @ldap_bind($ldapconn, $ldaprdn, $ldappass);

        if ($ldapbind) {

          Yii::log('Controllo le credenziali con ldap', 'trace', 'custom');

          $user = Utenti::model()->find('lower(username)=?', array($this->username));

          if ($user === null) {

            

            Yii::log('Utente non trovato nel database.', 'trace', 'custom');

            $user = new Utenti();

            $user->username = $this->username;

            $user->password = md5($this->password);

            $user->anno = date('Y');

            

            if ($user->save()) {

              Yii::log('Controllo le credenziali con ldap', 'trace', 'custom');

              $this->_id = $user->id;

            } else {

              Yii::log('Non sono riuscito a salvare.', 'trace', 'custom');

            }

          } else {

            Yii::log('Salvo l\'id dell\'utente.', 'trace', 'custom');

            $this->_id = $user->id;

          }

          Yii::log('Utente non trovato nel database.', 'trace', 'custom');

          $this->errorCode = self::ERROR_NONE;

        } else {


          Yii::log('Controllo nel database username e password', 'trace', 'custom');

          $user = Utenti::model()->find('lower(username)="' .

                          ($this->username) .

                          '" and password = "' .

                          (md5($this->password)) .

                          '"');

          if ($user === null) {


            Yii::log('Non ho trovato corrispondenza con la username "' . $this->username . '"', 'trace', 'custom');

            $this->errorCode == self::ERROR_UNKNOWN_IDENTITY;

          } else {


            Yii::log('Ho trovato corrispondenza con la username "' . $this->username . '"', 'trace', 'custom');

            $this->_id = $user->id;

            $this->errorCode = self::ERROR_NONE;

          }

        }

      }

      return $this->errorCode == self::ERROR_NONE;

    }


    public function getId() {

      return $this->_id;

    }


  }


  

In verità io vorrei avere una feature in più: poter assegnare i ruoli di Rights (Tasks) direttamente da LDAP. Mi confermi che con il tuo metodo in realtà la parte di autorizzazione rimane alla applicazione (cioè che gestisci solo l’autenticazione con LDAP) ?

Si si te lo confermo. Io controllo solo se dentro al server ldap c’è una certa identità. Se non è li cerco nel db. Poi potrei avere anche permessi e ruoli differenti nell’applicazione. Purtroppo non ho mai usato ldap in maniera approfondita e non mi si è presentato mai il problema che descrivi tu.