2012-02-10 11 views
13

Ho avuto successo con la mia app Rails 3 in esecuzione con devise e devise_ldap_authenticatable su autenticare contro Active Directory locale.Rails 3 e devise_ldap_authenticatable: autorizzazione contro Active Directory?

Ora desidero aggiungere autorizzazioni per consentire l'accesso solo agli utenti AD appartenenti a determinati gruppi di annunci.

Quindi, per iniziare in modo semplice, ho prima cercato il mio utente in AD con il comando linux ldapsearch. Il risultato conteneva qualcosa di simile ...

(...) 
memberOf: CN=my,OU=foo,DC=bar,DC=role,DC=domain,DC=com 
memberOf: CN=my,OU=foo,DC=bar2,DC=role,DC=domain,DC=com 
memberOf: (...) 
(...) 

Ok, ora ho deciso, che voglio limitare l'accesso ai membri del CN=my,OU=foo,DC=bar,DC=role,DC=domain,DC=com.

Così, ho cambiato la mia ldap.yml per contenere:

authorizations: &AUTHORIZATIONS 
    group_base: ou=role,dc=domain,dc=com 
    required_groups: 
    - CN=my,OU=foo,DC=bar,DC=role,DC=domain,DC=com 

development: 
    (...) 
    <<: *AUTHORIZATIONS 

E in aggiunta cambiato la mia devise.rb per contenere:

Devise.setup do |config| 
    config.ldap_logger = true 
    config.ldap_create_user = true 
    config.ldap_update_password = false 
    config.ldap_check_group_membership = true # <-- activated this line 
    config.ldap_use_admin_to_bind = true 
    #config.ldap_ad_group_check = true <-- don't know what this is good for 

Ora, w gallina cercando di autenticazione, l'accesso è negato, che non mi aspettavo:

User CN=myuser,OU=org,DC=domain,DC=com is not in group: CN=my,OU=foo,DC=bar,DC=role,DC=domain,DC=com 

Qualsiasi idea, come l'autorizzazione contro l'AD è compiuta con devise_ldap_authenticatable? La documentazione di questo modulo non è ancora così completa quando si tratta di autorizzazione.

+3

Si prega di rispondere alla domanda di seguito (inviare una risposta). In questo modo la domanda rimane (non necessario aperto). – Roger

+0

Grazie, funziona benissimo. Fai attenzione al maiuscolo 'CN' e 'OU' nel require_attribute, altrimenti non funzionerà. Mi ci vogliono alcune ore ... – neonmate

+0

Potresti postare una risposta, per favore? – Ryan

risposta

4

Nota: Aggiunta di una risposta per conto del PO (@kwirschau)


  1. Change devise.rb per attivare l'attributo ldap_check_attributes e rimuovere/commentare ldap_check_group in quanto non controlla contro l'AD- attributo specifico memberOf
  2. Modificare ldap.yml e commentare group_base e required_groups. Aggiungi l'appartenenza al gruppo richiesta a require_attribute.

In sintesi, l'impostazione per l'esempio in questione si presenta così:

# devise.rb 

Devise.setup do |config| 
    # [ ... ] 
    config.ldap_check_attributes = true 
    # [ ... ] 
end 

e

# ldap.yml 

# [ ... ] 
authorizations: &AUTHORIZATIONS 
    #group_base: ou=role,dc=domain,dc=com 
    #required_groups: 
    # - CN=my,OU=foo,DC=bar,DC=role,DC=domain,DC=com 
    require_attribute: 
    memberOf: CN=my,OU=foo,DC=bar,DC=role,DC=domain,DC=com 
# [ ... ] 
+0

Grazie. Questo dovrebbe essere inserito nella documentazione. – Gob

5

Quindi, la risposta da zekus funziona solo se l'utente è direttamente un membro del gruppo dato. Non cercherà i gruppi in modo ricorsivo. kwirschau, eri quasi lì con la tua configurazione iniziale. Lei ha affermato:

"#config.ldap_ad_group_check = true <-- don't know what this is good for" 

Quando è impostata quella bandiera, la query LDAP cercherà gruppi nidificati utilizzando un filtro con la regola LDAP_MATCHING_RULE_IN_CHAIN, che cerca gruppi dell'utente in modo ricorsivo.

Così, nella tua idea.RB, impostare:

config.ldap_check_group_membership = true 
    config.ldap_use_admin_to_bind = true 
    config.ldap_ad_group_check = true 

Impostare il gruppo di autorizzazione nel vostro ldap.yml

authorizations: &AUTHORIZATIONS 
    group_base: ou=role,dc=domain,dc=com 
    required_groups: 
    - CN=my,OU=foo,DC=bar,DC=role,DC=domain,DC=com 

Inoltre, nel codice, se si desidera controllare un utente contro un altro gruppo, non utilizzare "memberOf ", poiché questo non cercherà i gruppi nidificati. Utilizzare invece:

ldap_connect = Devise::LdapAdapter.ldap_connect(username) 
ldap_connect.in_group?(group_name) 
Problemi correlati