присвояване на роли в devise/cancan/deviseldap/rolify и използване на ldap_param_value

Долен ред отпред: Как мога да присвоя роля от ldap веднага, когато потребител влезе.

Използвам devise/cancan/deviseldap/rolify за удостоверяване на потребителите и след това се надявам да присвоя роля. Близо съм мисля това да заработи. Това, което имам, е персонализиран инициализатор, който позволява на потребителя да влезе в приложението само ако има определен memberOf в записа си в ldap.

това работи благодарение на любезната помощ от човека в тази тема:

проверка на групи по време на изпълнение с devise и devise_ldap_authenticatable

И така, сега е време да разпределя роли, след тролене из мрежата реших, че може би най-добрият начин е after_create в user.rb от devise. Имах тези memberOf в config/initializer, но не мога да получа достъп до тях по-късно, както в user.rb, както е описано от следното, което опитах в 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

Най-големият проблем (има много, аз все още съм ruby ​​noobie) е, че имам това извикване на метод ldap_param_value и знам, че извикването му на себе си не е правилно, получих този код, работещ на същия ред в config/initializer/customdevise. rb (това е за моята предна врата catch all check): (Знам, че имам нужда от правилния обект, инстанциран, за да получа достъп до 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

Забележка: Друг недостатък по-горе е, че 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...

person Codejoy    schedule 11.07.2013    source източник
comment
Разбирам какво се опитвате да направите. Но не разбирам как/защо използвате LDAP тук.   -  person beck03076    schedule 11.07.2013
comment
тъй като ние се удостоверяваме срещу ldap и ролите се съхраняват в ldap. Active Directory, за да бъдем по-конкретни.   -  person Codejoy    schedule 11.07.2013
comment
Страхотно... Съхраних ролите си в mysql таблица. Ще споделя с кода, който го прави. Тогава разликата между вас и мен трябва да е в механизмите за извличане на роли. Искате ли да обясните защо ролите се съхраняват в LDAP?   -  person beck03076    schedule 11.07.2013
comment
Е, мисля, че механизмите за извличане на роли са почти ключови тук. Въпреки че ролите са там, защото това, което изграждам, е сайт, който да замени по-стар сайт...този по-стар сайт направи всичко в AD. Така че потребителите имат достъп до новия сайт, искам да е прозрачен: те влизат и техните роли се прехвърлят.   -  person Codejoy    schedule 11.07.2013


Отговори (1)


това е просто,

  1. Таблица Разрешения ще съдържа всички модели и действия, които могат да се извършват от потребителите.
  2. Разрешения HABTM потребители и потребители HABTM разрешения
  3. Ролите има_много потребители, потребителят принадлежи_на роля
  4. Роли HABTM Разрешения и разрешения HABTM Роли
  5. Ако установите всички горепосочени асоциации и въз основа на current_user id, можете да извлечете каква е ролята на потребителя и да извлечете неговите разрешения и тези разрешения ще бъдат инстанцирани в Ability class по следния метод,

         def initialize(user)   
            user.role.permissions.each do |permission|
              if permission.subject_class == "all"
                can permission.action.to_sym, permission.subject_class.to_sym
              else
                can permission.action.to_sym, permission.subject_class.constantize
            end
          end
         end
    

Тази връзка показва как да го направите,

http://blog.joshsoftware.com/2012/10/23/dynamic-roles-and-permissions-using-cancan/

person beck03076    schedule 11.07.2013
comment
уау много неща има. Наистина мисля, че просто трябва да мога да получа ldap ролите и след това да ги запазя в базата данни. Докато се уверявам, че моят application.yml има зададените роли там, които записвам в базата данни (след четене и тестване спрямо това, което беше намерено в ldap) и планирах да направя това по време на създаване на потребител... най-големият ми проблем е просто не с достъп до ролите от ldap по време на after_create - person Codejoy; 11.07.2013
comment
Гласувах в подкрепа на тази причина, че беше добър отговор, но не го приех като отговор, защото не стигна до същността на това, което моят конкретен проблем беше изваждането на memberOf от ldap някъде, което НЕ беше config/initializers. - person Codejoy; 12.07.2013