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
.