3

次の問題があります。私たちのアプリは、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

私は状況に対処するための代替および/またはより良い設計に興味があります。

何かアイデア/提案はありますか?

4

1 に答える 1

1

DB接続についてはThread.current[]、rackappでお勧めします。疑似グローバル変数は必要悪である場合があります。

ユーザー資格情報をクライアントに保存するのが最適な解決策です。ブルート フォースから保護するために、パスワード フィールドにさらに別の暗号化を加えることができます。これは、Cookie がハッシュされているため、ローカルで復号化が成功した場所を確認できるため、ブルート フォース攻撃が可能になる可能性があるためです。資格情報をサーバーのどこかに保存すると、サーバーがハッキングされた場合にすべてのパスワードが危険にさらされます。クライアント側にデータを保存すると、両方の部分 (サーバー上のキーと Cookie) が必要になるため、より安全になります。

于 2012-07-26T09:25:26.387 に答える