首先,我从来没有开发过这种身份验证系统,但如果我必须这样做,我可能会选择Warden,这是一个集成为机架中间件的身份验证系统。
Warden 允许建立您自己的身份验证策略。所以我为你的情况做了一个例子,但请注意它不起作用。这只是为了清楚起见。
这个想法是在机架中间件中使用给定的用户名/密码重新配置您的数据库池。机架中间件是请求中调用的第一个组件,所以我认为它应该避免性能问题。
Warden::Strategies.add(:database_user) do
def valid?
ActiveRecord::Base.connected?
end
def authenticate!
# Disconnects all connections in the pool, and clears the pool.
ActiveRecord::Base.connection_pool.disconnect!
# Reconfigure the pool with the new username/password
config = Rails.application.config.database_configuration[Rails.env]
config['username'] = params[:username]
config['password'] = params[:password]
# Establish connection with the new configuration
ActiveRecord::Base.establish_connection(config)
# Check if the connection works
# It means that the username/password is correct
if ActiveRecord::Base.connected?
user = build_user(params[:username])
success!(user)
else
fail!("Wrong username/password")
end
rescue # Errors thrown by Postgres
fail!("Wrong username/password")
end
private
def build_user(username)
OpenStruct.new({username: username}) # Dynamic object
end
end
然后在 Rails 配置文件中配置 Warden。
Rails.configuration.middleware.use RailsWarden::Manager do |manager|
manager.default_strategies :database_user
manager.failure_app = LoginController
end
再一次,这只是一个原型,让您了解如何解决问题。我希望这会对你有所帮助。