2012-02-10 7 views
13

Udało mi się uruchomić moją aplikację Rails 3 z devise i devise_ldap_authenticatable do uwierzytelnić przeciwko lokalnej Active Directory.Szyny 3 i devise_ldap_authenticatable: Autoryzacja wobec Active Directory?

Teraz chcę dodać uprawnienia w celu umożliwienia dostępu tylko użytkownikom AD należącym do określonych grup AD.

Zacznijmy od prostoty. Najpierw sprawdziłem swojego użytkownika w AD za pomocą polecenia ldapsearch. Wynik zawierał coś takiego ...

(...) 
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, teraz zdecydowałem, że chcę, aby ograniczyć dostęp do członków CN=my,OU=foo,DC=bar,DC=role,DC=domain,DC=com.

Więc zmieniłem ldap.yml zawierać:

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 

A ponadto zmieniłem devise.rb zawierać:

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 

teraz w kura próby uwierzytelnienia, odmowa dostępu, który nie spodziewałam:

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 

Każdy pomysł, jak zezwolenie na AD jest realizowane devise_ldap_authenticatable? Dokumentacja tego modułu nie jest jeszcze tak obszerna, jeśli chodzi o autoryzację.

+3

Proszę odpowiedzieć na poniższe pytanie (zatwierdzić odpowiedź). W ten sposób pozostaje pytanie (niepotrzebnie otwarte). – Roger

+0

Dzięki, że działa świetnie. Uważaj na wielkie litery "CN" i "OU" w require_attribute, w przeciwnym razie nie będzie działać. Zajmuje mi to kilka godzin ... – neonmate

+0

Czy możesz napisać odpowiedź samemu sobie? – Ryan

Odpowiedz

4

Uwaga: Dodawanie odpowiedź w imieniu PO (@kwirschau)


  1. Zmian devise.rb aby uaktywnić atrybut ldap_check_attributes i usunąć/wykomentuj ldap_check_group gdyż nie sprawdza przed ad- specyficzny atrybut memberOf
  2. Zmień ldap.yml i wykomentuj group_base i required_groups. Dodaj wymagane członkostwo w grupie do require_attribute.

Podsumowując, konfiguracja na przykład w kwestii wygląda następująco:

# devise.rb 

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

i

# 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

Dzięki. Powinno to zostać wprowadzone do dokumentacji. – Gob

5

Więc odpowiedź przez zekus będzie działać tylko wtedy, gdy użytkownik jest bezpośrednio członek danej grupy. Nie będzie wyszukiwał grup rekursywnie. Kwirschau, byłeś już prawie przy początkowej konfiguracji. Ty stwierdził:

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

Gdy ta flaga jest ustawiona, kwerendy LDAP wyszuka grup zagnieżdżonych za pomocą filtra z reguły LDAP_MATCHING_RULE_IN_CHAIN, który przeszukuje grup użytkownika rekurencyjnie.

Tak więc, w swoim urządzeniu.rb, ustaw:

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

Ustaw grupę autoryzacji w 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 

Dodatkowo w kodzie, jeśli chcesz sprawdzić użytkownika przed innej grupie, nie należy używać „memberOf ", ponieważ nie będzie to wyszukiwanie zagnieżdżonych grup. Zamiast tego użyj:

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