2012-02-10 15 views
13

Tengo con éxito mi aplicación Rails 3 ejecutándose con devise y devise_ldap_authenticatable a autenticar contra el Active Directory local.Rails 3 & devise_ldap_authenticatable: ¿Autorización contra Active Directory?

Ahora quiero agregar autorizaciones autorizaciones para permitir el acceso solo a los usuarios de AD que pertenecen a ciertos grupos de AD.

Para comenzar de manera simple, primero busqué mi propio usuario en AD con el comando de Linux ldapsearch. El resultado contenida algo así como ...

(...) 
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, ahora decidí, que yo quiero para restringir el acceso a los miembros de CN=my,OU=foo,DC=bar,DC=role,DC=domain,DC=com.

Por lo tanto, he cambiado de ldap.yml que contiene:

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 

Y además cambió mi devise.rb contener:

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 

Ahora, w gallina intentar la autenticación, el acceso es denegado, que no esperaba:

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 

Cualquier idea, la forma de autorización respecto a AD se logra con devise_ldap_authenticatable? La documentación de este módulo aún no es tan completa cuando se trata de autorización.

+3

Responda su pregunta a continuación (confirme una respuesta). De esta manera, la pregunta permanece (innecesariamente abierta). – Roger

+0

Gracias, eso funciona genial. Tenga cuidado con la mayúscula 'CN' y 'OU' en require_attribute, de lo contrario no funcionará. Me toma algunas horas ... – neonmate

+0

¿Podría publicar una auto-respuesta, por favor? – Ryan

Respuesta

4

Nota: Adición de una respuesta en nombre de la OP (@kwirschau)


  1. devise.rb Cambio para activar el atributo ldap_check_attributes y quitar/comentar ldap_check_group ya que no se comprueba en contra de la AD- atributo específico memberOf
  2. Cambie ldap.yml y comente group_base y required_groups. Agregue la membresía de grupo requerida al require_attribute.

En resumen, la configuración para el ejemplo de la cuestión es así:

# devise.rb 

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

y

# 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

Gracias. Esto debe ser puesto en la documentación. – Gob

5

Por lo tanto, la respuesta por zekus sólo funcionará si el usuario es directamente un miembro del grupo dado. No buscará grupos recursivamente. kwirschau, estabas casi allí con tu configuración inicial. Usted ha declarado:

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

Cuando se establece que la bandera, la consulta LDAP buscará grupos anidados mediante el uso de un filtro con la norma LDAP_MATCHING_RULE_IN_CHAIN, que busca en los grupos del usuario de forma recursiva.

Por lo tanto, en su diseño.rb, establezca:

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

Fija tu grupo de autorización en su 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 

Además, en su código, si desea comprobar un usuario contra otro grupo, no utilice "memberOf ", ya que esto no buscará grupos anidados. En su lugar, use:

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