Подтвердить что ты не робот

Rails 3 и devise_ldap_authenticatable: авторизация в Active Directory?

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

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

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

(...)
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? Документация этого модуля еще не является исчерпывающей, когда дело доходит до авторизации.

4b9b3361

Ответ 1

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


  • Измените devise.rb, чтобы активировать атрибут ldap_check_attributes и удалить/закомментировать ldap_check_group, поскольку он не проверяет атрибут, специфичный для AD memberOf
  • Измените 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
# [ ... ]

Ответ 2

Итак, ответ 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)