次の問題があります。私たちのアプリは、Exchange Webサービス(EWS)を介してExchangeとインターフェイスします。これは、単なる豪華なDBと考えることができます。例として、Exchangeのカレンダーと同期する必要がある予定モデルがあります。現在、EWSでは、接続ごとにユーザーの資格情報が必要です。これにより、2つの問題が発生します。
- リクエストごとにユーザーの資格情報を取得するにはどうすればよいですか?
- モデルはEWSとどのように相互作用する必要がありますか?
私たちがしたくないのは、EWSとの対話を必要とするすべてのアクションでユーザーにパスワードを要求することです。また、セキュリティを犠牲にしたくありません。
現在のソリューション:
ユーザーからの資格情報(ログイン中に取得)をセッションに保存します。これは、ユーザー名とパスワードがクライアントコンピューターのCookieに保存されていることを意味するため、醜いです。暗号化されていることはわかっていますが、それでも醜いです。
次に、コントローラーで、EWSクライアントを遅延作成し、EWSと対話する必要がある各モデルインスタンスに渡します。これは、他のDB操作とは異なり(EWSを単なる別のデータベースと考えることができる)、操作ごとに追加の手順を実行する必要があることを意味するため、醜いです。
例(簡略化/削除):
# app/models/appointments.rb
class Appointment
attr_writer :ews
def pull_from_exchange
exchange_event = ews.events[exchange_id, exchange_change_key]
# …update from exchange_event.to_hash…
self
end
def push_to_exchange
exchange_event = ews.events.new(to_hash_for_exchange)
exchange_event.save
update_attributes(exchange_id: exchange_event.id, exchange_change_key: exchange_event.change_key)
self
end
def ews
raise EwsClientNotProvided unless @ews
@ews
end
def save_and_push!
self.class.transaction do
save!
push_to_exchange
end
end
end
# app/controllers/appointments_controller.rb
class AppointmentsController < ApplicationController
def create
@appointment = Appointment.new(params[:appointment])
@appointment.ews = ews
@appointment.save_and_push!
end
private
def ews
@ews ||= Ews.client(session.slice(:username, :password, :email).merge(endpoint: ews_endpoint))
end
def ews_endpoint
Rails.application.configuration.ews_endpoint
end
end
私は状況に対処するための代替および/またはより良い設計に興味があります。
何かアイデア/提案はありますか?