当我不关心它们是什么组时,我可以得到这个devise_ldap_authenticatable正常工作,它连接到ldap并验证用户在设计下签名或不签名。但我想只允许某些特定群体中的某些成员参与。我在这里有一个关于这个问题的帖子:
Checking group membership in rails devise ldap gem, is it in the yaml?
(完整性的宝石就是这个:https://github.com/cschiewek/devise_ldap_authenticatable)
认为我在问错误的问题。我想我想知道如何设计(并且devise_ldap_authenticatable是存储的数据,也许我可以查看我自己的memberOf数组,并在代码中检查我自己的组,然后在那时不要让它们进入。是在网上的任何地方,这是什么?我的谷歌搜索已经发现什么,但不是一个ldap或设计专业我猜我的条件很糟糕。 我确信我可能错过了如何做到这一点,最接近我可以看到这可能有所帮助(尽管我阅读它的形式对我来说没有意义,这是自述的部分:
https://github.com/cschiewek/devise_ldap_authenticatable/blob/master/README.md
关于查询ldap,是这种情况吗?)
答案 0 :(得分:3)
您可以通过User
(或等效)模型上的回调或验证来执行此操作。
before_create :user_is_not_member_of_specified_group?
private
def user_is_not_member_of_specified_group?
member_of = Devise::LdapAdapter.get_ldap_param(self.username,"memberOf")
test member_of
end
其中test
是一种根据您的成员组条件返回true / false的方法。
Devise::LdapAdapter.get_ldap_param(self.username,"memberOf")
是来自devise_ldap_authenticatable
的方法,它将返回一组成员组。您需要在此阵列上运行组测试。
如果您使用验证,则可以为未通过测试的用户指定错误消息。希望这会有所帮助。
修改强>
处理此问题的另一种方法是让gem通过在authorized?
(https://github.com/cschiewek/devise_ldap_authenticatable/blob/master/lib/devise_ldap_authenticatable/ldap_adapter.rb)中对Devise::LdapAdapter::LdapConnect
方法进行monkeypat,来处理重定向和错误消息。它看起来像是:
Devise::LdapAdapter::LdapConnect.class_eval do
def user_group_test
member_of = self.ldap_param_value("memberOf")
test member_of # your group test method
end
def authorized?
DeviseLdapAuthenticatable::Logger.send("Authorizing user #{dn}")
if !user_group_test
DeviseLdapAuthenticatable::Logger.send("Not authorized because custom authentication failed.")
return false
elsif !authenticated?
DeviseLdapAuthenticatable::Logger.send("Not authorized because not authenticated.")
return false
elsif !in_required_groups?
DeviseLdapAuthenticatable::Logger.send("Not authorized because not in required groups.")
return false
elsif !has_required_attribute?
DeviseLdapAuthenticatable::Logger.send("Not authorized because does not have required attribute.")
return false
else
return true
end
end
end
您可能希望将其放在config/initializers
中的自定义初始化文件中。