Долен ред отпред: Как мога да присвоя роля от 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...