Rails 3 & devise_ldap_authenticatable: авторизация для Active Directory? - PullRequest
13 голосов
/ 10 февраля 2012

У меня успешно работает приложение Rails 3 с devise и devise_ldap_authenticatable для аутентификации в локальной Active Directory.

Теперь я хочу добавить полномочия , чтобы разрешить доступ только пользователям AD, которые принадлежат к определенным группам AD.

Итак, для начала я сначала нашел своего пользователя в AD с помощью команды linux ldapsearch. Результат содержал что-то вроде ...

(...)
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: (...)
(...)

Хорошо, теперь я решил, что хочу ограничить доступ к членам CN=my,OU=foo,DC=bar,DC=role,DC=domain,DC=com.

Итак, я изменил свой 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

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

И, кроме того, изменил мой devise.rb, чтобы он содержал:

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

Теперь при попытке аутентификации доступ запрещен, чего я не ожидал:

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

Есть идеи, как авторизация для AD осуществляется с помощью devise_ldap_authenticatable? Документация этого модуля еще не настолько исчерпывающая, когда дело доходит до авторизации.

Ответы [ 2 ]

5 голосов
/ 09 октября 2013

Таким образом, ответ от zekus будет работать только в том случае, если пользователь является непосредственным участником данной группы. Он не будет искать группы рекурсивно. kwirschau, вы были почти там с вашей первоначальной конфигурацией. Вы заявили:

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

Когда этот флаг установлен, запрос ldap будет искать вложенные группы, используя фильтр с правилом LDAP_MATCHING_RULE_IN_CHAIN, который рекурсивно ищет группы пользователей.

Таким образом, в вашем devise.rb установите:

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

Установите вашу группу авторизации в вашем 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

Кроме того, в своем коде, если вы хотите проверить пользователя по другой группе, не используйте "memberOf", так как это не будет искать вложенные группы. Вместо этого используйте:

ldap_connect = Devise::LdapAdapter.ldap_connect(username)
ldap_connect.in_group?(group_name)
5 голосов
/ 25 июня 2013

Примечание: Добавление ответа от имени ФП ( @ kwirschau )


  1. Изменить devise.rb, чтобы активировать атрибут ldap_check_attributes и удалите / закомментируйте ldap_check_group, поскольку он не проверяет атрибут AD * memberOf
  2. Измените ldap.yml и закомментируйте group_base и required_groups.Добавьте необходимое членство в группе к require_attribute.

В итоге, настройка для примера в вопросе выглядит следующим образом:

# devise.rb

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

и

# 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
# [ ... ]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...