Rails 3&devise_ldap_authenticatable:对Active Directory的授权?

tsc*_*ein 13 authorization active-directory devise ruby-on-rails-3

我成功地使用devise和devise_ldap_authenticatable运行我的Rails 3应用程序以对本地Active Directory 进行身份验证.

现在,我想添加授权功能,以便只允许访问属于某些AD组的AD用户.

所以简单来说,我首先使用linux命令ldapsearch在AD中查找我自己的用户.结果包含了......

(...)
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: (...)
(...)
Run Code Online (Sandbox Code Playgroud)

好的,现在我决定,我想限制对成员的访问 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
Run Code Online (Sandbox Code Playgroud)

另外改变了我的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
Run Code Online (Sandbox Code Playgroud)

现在,在尝试进行身份验证时,拒绝访问,这是我没想到的:

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
Run Code Online (Sandbox Code Playgroud)

任何想法,如何使用devise_ldap_authenticatable完成对AD的授权?在授权方面,该模块的文档还不够全面.

小智 5

注意:代表OP添加答案(@kwirschau)


  1. 更改devise.rb以激活属性ldap_check_attributes并删除/注释掉,ldap_check_group因为它不会检查特定于AD的属性memberOf
  2. 更改ldap.yml并注释掉group_baserequired_groups.添加所需的组成员身份require_attribute.

总之,问题中示例的设置如下所示:

# devise.rb

Devise.setup do |config|
  # [ ... ]
  config.ldap_check_attributes = true
  # [ ... ]
end
Run Code Online (Sandbox Code Playgroud)

# 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
# [ ... ]
Run Code Online (Sandbox Code Playgroud)


Rog*_*rza 5

因此,zekus的答案只有在用户直接成为给定组的成员时才有效.它不会递归搜索组.kwirschau,你的初始配置几乎就在那里.你说:

"#config.ldap_ad_group_check = true <-- don't know what this is good for"
Run Code Online (Sandbox Code Playgroud)

设置该标志后,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
Run Code Online (Sandbox Code Playgroud)

在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
Run Code Online (Sandbox Code Playgroud)

此外,在您的代码中,如果要针对另一个组检查用户,请不要使用"memberOf",因为这不会搜索嵌套组.相反,使用:

ldap_connect = Devise::LdapAdapter.ldap_connect(username)
ldap_connect.in_group?(group_name)
Run Code Online (Sandbox Code Playgroud)