2

当我不关心它们是什么组时,我可以让这个 devise_ldap_authenticable 工作得很好,它要么连接到 ldap 并验证在设计下登录的用户,要么不验证。但我只想让属于一个或几个特定群体的某些成员加入。我在这里有一个关于这个问题的帖子:

检查rails中的组成员身份设计ldap gem,它在yaml中吗?

(为了完整起见,宝石是这个:https ://github.com/cschiewek/devise_ldap_authenticable )

开始认为我问错了问题。我想我想知道如何设计(并且 devise_ldap_authenticable 是存储的数据,也许我可以自己查看我的 memberOf 数组并在代码中检查自己的组,然后那时不要让他们进入。是网上有什么地方是这样的吗?我的谷歌搜索什么也没找到,但不是 ldap 或 devise pro 我猜我的条件很糟糕。我相信我可能会错过如何做到这一点,最接近我能看到的可能帮助(虽然我读到它的形式对我来说意义不大,但这里的自述文件中的部分:

https://github.com/cschiewek/devise_ldap_authenticable/blob/master/README.md

关于查询ldap,是这样吗?)

4

1 回答 1

4

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

wheretest是一种根据您对成员组的条件返回 true/false 的方法。

Devise::LdapAdapter.get_ldap_param(self.username,"memberOf")是一个方法devise_ldap_authenticatable,它将返回一个成员组数组。您需要在此阵列上运行您的组测试。

如果您使用验证,您可以为未通过测试的用户指定错误消息。希望这可以帮助。

编辑

处理此问题的另一种方法是让您的 gem 通过猴子修补( https://github.com/cschiewek/devise_ldap_authenticatable/blob/master/lib/devise_ldap_authenticatable/ldap_adapter.rb )中的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.

于 2013-06-24T17:20:50.390 回答