我可以让这个desve-ldap-authenticateable正常工作,当我不关心它们是什么组时,它要么连接到ldap,要么验证在desve下登录的用户,要么不验证。但是我只想让一个或多个特定组之外的某些成员进入。我在这里有一个关于这个问题的帖子:
Checking group membership in rails devise ldap gem, is it in the yaml?
(为了完整起见,宝石是这个:https://github.com/cschiewek/devise_ldap_authenticatable)
我想我问错了问题。我想我想知道在devide中是如何实现的(devide_ldap_authenticatable是存储在哪里的数据,也许我可以在代码中查看我自己的成员数组并检查这些组,然后在那时不要让它们进入。网上有什么地方是这样的吗?我的谷歌搜索什么也没有找到,但不是一个LDAP或设计专业我猜我的条件很糟糕。
我确信我可能错过了如何做到这一点,我能看到的最接近这一点可能会有所帮助(尽管在我阅读时,它的形式对我来说没有什么意义,这里是自述文件的一部分:
https://github.com/cschiewek/devise_ldap_authenticatable/blob/master/README.md
关于查询LDAP,是这样吗?)
最佳答案
您可以通过对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通过monkeypatching
authorized?
中的Devise::LdapAdapter::LdapConnect
方法来处理重定向和错误消息。看起来像是: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
中的自定义初始值设定项文件中。