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