我成功地使用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: (...)
(...)
好的,现在我决定,我想限制对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
任何想法,如何使用devise_ldap_authenticatable完成对AD的授权?在授权方面,该模块的文档还不够全面。
答案 0 :(得分:5)
注意:代表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
# [ ... ]
答案 1 :(得分:5)
因此,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)