Итак, я видел, как за это проголосовали, и отметил, что я никогда не публиковал то, что я сделал.Вот что я разобрался.«GINA» была отдельной, унаследованной базой данных, в которой хранились данные и учетные записи пользователей.Я создал раздел YAML для этого соединения в database.yml и изменил модель User для работы со схемой.
user.rb
class User < ActiveRecord::Base
establish_connection :gina
self.table_name = "mysql.user"
self.primary_key = "user"
end
users_controller.rb
def authenticate
user = params[:username]
pass = params[:password]
valid = authenticate_user(user, pass)
if valid
session[:username] = user
session[:password] = pass
cookies[:username] = user
cookies[:password] = pass
redirect_to gina_tables_path
else
redirect_to gina_tables_path, :notice => "Login failed."
end
end
application_controller.rb
def authenticate_user(user, pass)
begin
u = nil if u == 'root'
u = User.find(user) # <- Here's the call to get the user, with password.
unless u.nil?
hash = "*" + Digest::SHA1.hexdigest(Digest::SHA1.digest(pass)).upcase
old_hash = old_password(pass)
if u.Password === hash || u.Password === old_hash
session[:username] = user
return true
end
return false
end
rescue Exception => e
Rails.logger.info(e)
return false
end
end
Поскольку модель User основана на строке имени пользователя, User.find (user) получает пользователя из пользовательской таблицы MySQL, которая содержит свой хешированный пароль.,Таким образом, весь трюк сводился к тому, чтобы использовать тот же самый тип хэша пароля, который использует MySQL, и сравнить этот хеш (предоставленный пароль) с хешем в базе данных для этого пользователя.Если они равны, это авторизованный логин.