Yii Framework Forum: YII + ldap + rights - Yii Framework Forum

Jump to content

Page 1 of 1
  • You cannot start a new topic
  • You cannot reply to this topic

YII + ldap + rights Rate Topic: -----

#1 User is offline   d4rkstar 

  • Junior Member
  • Pip
  • Yii
  • Group: Members
  • Posts: 21
  • Joined: 19-February 11
  • Location:Naples / Italy

Posted 31 May 2011 - 08:58 AM

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
0

#2 User is offline   dchan 

  • Junior Member
  • Pip
  • Yii
  • Group: Members
  • Posts: 32
  • Joined: 28-March 11
  • Location:Italy

Posted 01 June 2011 - 07:41 AM

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.
0

#3 User is offline   d4rkstar 

  • Junior Member
  • Pip
  • Yii
  • Group: Members
  • Posts: 21
  • Joined: 19-February 11
  • Location:Naples / Italy

Posted 01 June 2011 - 10:18 AM

View Postdchan, on 01 June 2011 - 07:41 AM, said:

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:

"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."


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
0

#4 User is offline   sensorario 

  • Elite Member
  • Yii
  • Group: Moderators
  • Posts: 1,986
  • Joined: 07-September 10
  • Location:Cesena (Italy)

Posted 03 June 2011 - 03:00 AM

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;
    }

  }

  

0

#5 User is offline   d4rkstar 

  • Junior Member
  • Pip
  • Yii
  • Group: Members
  • Posts: 21
  • Joined: 19-February 11
  • Location:Naples / Italy

Posted 03 June 2011 - 03:14 AM

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) ?
0

#6 User is offline   sensorario 

  • Elite Member
  • Yii
  • Group: Moderators
  • Posts: 1,986
  • Joined: 07-September 10
  • Location:Cesena (Italy)

Posted 03 June 2011 - 03:32 AM

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.
0

Share this topic:


Page 1 of 1
  • You cannot start a new topic
  • You cannot reply to this topic

1 User(s) are reading this topic
0 members, 1 guests, 0 anonymous users