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