使用devise和devise_ldap_authenticatable在运行时检查组

时间:2013-06-23 04:29:35

标签: ruby ruby-on-rails-3 devise ldap

当我不关心它们是什么组时,我可以得到这个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,是这种情况吗?)

1 个答案:

答案 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中的自定义初始化文件中。