3

Rails アプリのログインに pg_audit_log を使用したいと考えています。監査ログには、変更された列だけでなく、それらの変更を行ったユーザーも表示される必要があります。ドキュメントにはこれを行う方法は示されていませんが、pg_audit_log ソース (postgresql_adapter.rb) を調べたところ、スレッド ローカル変数 ala からユーザー情報が読み取られていることがわかります。

current_user = Thread.current[:current_user]

次のように、フィルターの前後にこれを設定/設定解除することを検討しました。

Thread.current[:current_user] = current_user

(コントローラーで current_user ヘルパー メソッドを使用して、現在ログインしているユーザーを取得します)、しかしそれは危険なようです。私は現在、Rails リクエスト サイクルとスレッドがどのように相互作用するかを理解しようと時間を費やしており、どれほど危険かをよりよく理解しています。それまでの間、現在 pg_audit_log を使用している SO ユーザーが、ユーザーがレコードを変更するたびに user_id と user_unique_name をログ テーブルに記録する必要性を解決したかどうかに興味がありました。

4

2 に答える 2

4

あなたが説明した方法で現在のユーザーを設定することは、それを行う一般的な方法です。たとえば、http://rails-bestpractices.com/posts/47-fetch-current-user-in-modelsを参照してください。

サンプル コードは次のようになります。

# in your model
class User < ActiveRecord::Base
  def self.current
    Thread.current[:current_user]
  end
  def self.current=(user)
    Thread.current[:current_user] = user if user.nil? || user.is_a?(User)
  end
end

# in your controller
class ApplicationController < ActionController::Base
    before_filter :set_current_user
    def set_current_user
      User.current = user_signed_in? ? current_user : nil
    end
end
于 2013-04-02T12:19:43.377 に答える
1

Thread.currentコントローラーによって管理されるオブジェクトへのモデルレベルのアクセスを提供するためにハッシュに依存することは、確かに物議を醸しています。たとえば、次を参照してください。

レールでの Thread.current[] 使用の安全性

この特定の機能がpg_audit_loggem で文書化されていないのは気になるところです。

gem のソース コードを積極的に調べたことがなくThread.current[:current_user] = something、独自の目的のために独自のアプリケーションで独自に定義することを決定したとします。その場合、pg_audit_log知らないうちにそのオブジェクトを監査します。

確かに、この名前current_userは、認証ルーチンによって定義された現在ログオンしているユーザーを意味するものとして広く受け入れられているため、この潜在的なバグを具体的な問題として想像することは困難ですが、設計の観点からは? ああ。

一方、自分が何をしているのかを知っているのでThread.current[:current_user]、すべての応答サイクルの最初/最後に が設定/設定解除されていることを確認すると、プロセスが安全になります。少なくとも、このトピックに関する多くの投稿を読んで得たものです。

乾杯、ジュゼッペ

于 2013-04-05T06:48:34.273 に答える