0

結論: ユーザーがログインしたときに、LDAP からすぐに役割を割り当てるにはどうすればよいですか。

私は devise/cancan/deviseldap/rolify を使用してユーザーを認証し、できればロールを割り当てています。私はこれを機能させることに近いと思います。私が持っているのは、ldap エントリに特定の memberOf がある場合にのみユーザーをアプリに入れるカスタム初期化子です。

これは、このスレッドの人からの親切な助けのおかげで機能します。

devise と devise_ldap_authenticatable を使用して実行時にグループをチェックする

それでは、ロールを割り当てる時が来ました。ネット上でトローリングした後、devise の user.rb の after_create が最善の方法であると考えました。user.rbconfig/initializer にこれらの memberOf がありましたが、後でで試みた次のようにアクセスできませんuser.rb

 class User < ActiveRecord::Base
     after_create :assign_role
     ...
     ...
  private
  def assign_role
   puts "Assigning role!"
   member_of = self.ldap_param_value("memberOf")  #get array #i know self here is wrong
   member_of.each do |str|
   if str.include? 'Help Desk Admin'
      self.roles << "admin"
   end
   if str.include? 'Password Manager'
      self.roles << "password_manager"
   end
   if str.include? 'Security'
     self.roles << "security"
   end
   if str.include? 'Help Desk'
     self.roles << "help_desk"
   end
  end

 puts "roles assigned!"
 self.update
end

最大の問題 (私はまだルビー初心者です) は、メソッド ldap_param_value への呼び出しがあり、それを自分で呼び出すのが正しくないことを知っていることです。config/initializer/customdevise でこのコードが同じ行で動作するようになりました。 rb (これは、フロント ゲートのすべてのチェックをキャッチするためのものです): (上記の ldap_param_value にアクセスするには、適切なオブジェクトをインスタンス化する必要があることはわかっていますが、それが何であるかはわかりません)。私は自分自身がDevise::LdapAdapterだと思っていましたが、上記で試してみましたが、まだうまくいきませんでした:

Devise::LdapAdapter.ldap_param_value(...)

完全を期すために、私のconfig/initializer/customedevise.rb

Devise::LdapAdapter::LdapConnect.class_eval do
  def user_group_test
  member_of = self.ldap_param_value("memberOf") #self works here...
  checkgroups member_of # your group test method  end

 def checkgroups(members)
  retVal = false
  members.each do |str|
    if str.include? 'Help Desk Admin' or str.include? 'Password Manager' or  str.include? 'Security' or str.include? 'Help Desk'
        retVal = true;
    end
  end
  return retVal
end
#    'CN=Password Manager'
#    'CN=Help Desk'
#    'CN=Help Desk Admin'
#    'CN=Security'


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

注: 上記のもう 1 つの欠陥は、devise が認証が失敗した理由を正確に認識していないことです... 私はそれに苦しみ、より多くの情報を含めるようにdevise.en.ymlファイルinvalid:を変更しました:

en:
  devise:
   confirmations:
    confirmed: "Your account was successfully confirmed. You are now signed in."
    send_instructions: "You will receive an email with instructions about how to confirm your account in a few minutes."
    send_paranoid_instructions: "If your email address exists in our database, you will receive an email with instructions about how to confirm your account in a few minutes."
   failure:
     already_authenticated: "You are already signed in."
     inactive: "Your account was not activated yet."
     invalid: "Invalid email or password.  Or not a member of the correct group"

      ..etc...
4

1 に答える 1