0

訴訟のリクエストを追跡するアプリケーションを作成しようとしています。主なモデルはCaseであり、has_manySubject、Keywords、Notes、およびEvidences(has_manyCustodyLogs)です。アプリケーションは法律に関連しているため、通常とは異なる要件がいくつかあります。

  • CRUD操作は、操作が何であったか、アクターが誰であったか、操作がいつ発生したかなど、ログに記録する必要があります
  • データを検証するための何らかの方法が必要です(つまり、レコードのMD5チェックサムを記録する)
  • 一部のデータはライトワンスである必要があります(つまり、アプリは監査ログエントリを作成できますが、そのログはその後アプリケーション内から編集または削除できません)
  • 関連するオブジェクトへの変更は、おそらくネスト全体でログに記録する必要があります。たとえば、CustodyLogをエビデンスに追加するには、それ自体のログ、そのエビデンスのログ、および親ケースのログが必要です。これは、Caseモデルデータ自体が最後に変更されたときだけでなく、Caseの最終更新タイムスタンプが実際の最後の更新を正確に反映するようにするためです。

私はこれを少しは機能させていますが、問題が発生しています。認証は外部のWebシングルサインオンサービスによって処理されているため、ログインしているユーザーのIDに対する唯一の可視性はリクエスト変数にあります。たとえば、コールバックを介してモデルに監査ログを設定すると、すべてのデータ変更がログに記録されることはほぼ確実ですが、モデルには要求変数が表示されないため、ユーザーIDをログに記録できません。これにより、ステートマシンへの変更(現在はstate_machineプラグインを使用)がログに記録されます。

一方、監査ログをアプリケーションコントローラーに配置すると、すべてのCRUD操作がログに記録されることを確認できなくなります(たとえば、Subject.createを呼び出すCaseモデルのコードはログに記録されません)。 。また、状態の変化も失われると思います。

ログインしたユーザーのユーザーIDが記録されるように、すべてのCRUD操作がアソシエーションツリー全体にログに記録されるようにする方法はありますか?

4

1 に答える 1

0

CRUD 操作は、操作の内容、アクターが誰であるか、操作がいつ発生したかなど、ログに記録する必要があります。

これは、ActiveRecord::Callbacks と attr_accessor フィールドで対処できます。

ログに記録する必要があるモデルのいずれかで、次を追加します。

  attr_accessor :modifier_id, :modifier

  valiadate :valid_user
  before_validate :populate_modifier
  before_save :write_save_attempted_to_audit_log
  after_save :write_save_completed_to_audit_log

  def populate_modifier
    self.modifier = User.find_by_id(modifier_id) unless modifier
  end 

  def valid_user
    unless modifier
      errors.add(:modifiers_user_id, "Unknown user attempted to modify this record") 
      write_unauthorized_modification_to_audit_log
    end
  end

  def write_save_attempted_to_audit_log
    # announce that user is attempting to save a record with timestamp to audit log
    # use ActiveRecord::Dirty.changes to show the change the might be made
  end

  def write_save_competed_to_audit_log
    # announce that user has successfully changed the record with timestamp to audit log
  end

  def write_unauthorized_modification
    # announce that a change was attempted without a user
  end

いくつかのモデルでこれを使用する可能性が高いため、プラグインに抽象化し、必要な場合にのみ のようなメソッド呼び出しで追加できますaudit_changes。これを達成する方法についてのインスピレーションについては、acts_as プラグインのいずれかを参照してください。

@thing.modifier = @current_userコントローラーでは、保存する前に必ず追加する必要があります。


データを検証する何らかの方法が必要です (つまり、レコードの MD5 チェックサムを記録するなど)。

操作のチェックサムは...?inspect をオーバーライドして、レコード内のすべての情報を含む文字列を一貫した方法で出力し、そのチェックサムを生成できます。その間、ログ メソッドへの書き込みの一環として、監査ログに追加することもできます。


一部のデータは一度だけ書き込み可能にする必要があります (つまり、アプリは監査ログ エントリを作成できますが、その後、そのログをアプリケーション内から編集または削除することはできません)。

各アクセス ログを、確定的な名前 ( "/logs/audits/#{class}/#{id}/#{timestamp}") を付けて個別のファイルとして書き込み、保存したら書き込み権限を削除します。File.chmod(0555, access_log_file)


関連付けられたオブジェクトへの変更は、おそらくネスト全体でログに記録する必要があります。たとえば、CustodyLog を Evidence の一部に追加すると、それ自体のログ、その Evidence のログ、および親 Case のログが必要になります。これは、ケース モデル データ自体が最後に変更された時刻だけでなく、ケースの最終更新タイムスタンプが実際の最終更新を正確に反映するようにするためです。

4つ目の要件についてです。ネストされた関係のいずれかでaccepts_nested_attributes_forを使用すると、最初は自動的に私のソリューションに組み込まれます。および :autosave => belongs_to 関係の true 。


チェックサムを監査ログに保存している場合は、チェックを before_save メソッドにロールインして、作業中のオブジェクトが改ざんされていないことを確認できます。オブジェクトの最新の監査ログをチェックし、チェックサムを照合するだけです。

于 2009-10-23T22:34:22.093 に答える