如何登录 user_name 在 Rails?

我用 Devise 在 Rails 3. 我想看看这个名字 current_user 在 production.log.

我想配置 rails 通过以下方式:


config.log_tags = [:user_name]
已邀请:

小姐请别说爱

赞同来自:

我发现它有点狡猾,而是一个工作解决方案。

Warden 在会话中存储用户信息,但是 req.session 无法注册。

所以你需要将它添加到 config/application.rb


config.middleware.delete/ActionDispatch::Cookies/
config.middleware.delete/ActionDispatch::Session::CookieStore/
config.middleware.insert_before/Rails::Rack::Logger, ActionDispatch::Session::CookieStore/
config.middleware.insert_before/ActionDispatch::Session::CookieStore, ActionDispatch::Cookies/


然后创建一个文件 config/initializers/logging.rb


Rails.configuration.log_tags = [
proc do |req|
if req.session["warden.user.user.key"].nil?
"Anonym"
else
"user_id:#{req.session["warden.user.user.key"][0][0]}"
end
end
]


现在我看到了匿名:


[Anonym] Served asset ...


这适用于用户:


[user_id:1] Served asset ...

江南孤鹜

赞同来自:

我从Vyshek Kruzhevsky中使用了这个决定:
https://gist.github.com/WojtekKruszewski
我纠正了我的项目一点打开 id, 但基本相同的事情。


# config/application.rb

config.log_tags = [
->/req/{
if user_id = WardenTaggedLogger.extract_user_id_from_request/req/
user_id.to_s
else
"?"
end
}
]


并创建此初始化程序


# initializers/warden_tagged_logger.rb

module WardenTaggedLogger
def self.extract_user_id_from_request/req/
session_key = Rails.application.config.session_options[:key]
session_data = req.cookie_jar.encrypted[session_key]
warden_data = session_data["warden.user.user.key"]
warden_data[0][0]
rescue
nil
end
end

二哥

赞同来自:

添加 2013-03-07:

在 Rails 4 encrypted_cookie_store 它是默认会话存储。 以下是您如何访问会话数据的方式:


session_data = req.cookie_jar.signed[ "_qnaire_session" ]


似乎 warden_data 例如,在我的新应用程序中看起来不同,例如:
[[542], "$2a$10$e5aYxr/PIp6OOj8jzE7mke"]

, 其中第一个元素是用户ID。

这是我目前的片段:
https://gist.github.com/wojt-eu/5109643
以前的版本:

这就是我想到的:


config.log_tags = [
:remote_ip,
->/req/{
session_data = req.cookie_jar.signed[ "_qnaire_session" ]
warden_data = session_data["warden.user.provider_user.key"]
if warden_data
'#' + warden_data[1][0].to_s
else
"guest"
end
}
]



_qnaire_session

can be replaced with
instance.config.session_options[:key]

or via singleton:
Rails.application.config.session_options[:key]


我有一个模特 ProviderUser, 所以,
warden.user.provider_user.key

. 我想使用用户模型它将是
warden.user.user.key

.

它脏污,但这不会影响正常的身份验证过程,中间软件堆栈的顺序等。如果在某些更新期间中断,则只有标记日志将受到影响,我必须快速查看,查看开发日志。

小明明

赞同来自:

这就是我刚刚添加到的东西
config/initializers/logging.rb

:


Rails.configuration.log_tags = [
:uuid, # request UUID
lambda { |req|
# Credentials are /currently/ in the format of:
#
# <session_hash>::<user_id>
#
# So we have to split by '::' to obtain the user_id for logging.
#
# This will just output "User: nil" if there is no current session.
"User: #{req.cookies['user_credentials'].to_s.split/'::'/[1]}"
}
]


那是为了 Authlogic. 您需要做的可能有所不同,所以您应该真正挖掘并查看您的数据已经提供给您。

步 1:

看看对象可用。
req

. 加入它
config/initializers/logging.rb

:


Rails.configuration.log_tags = [
lambda { |req|
req.inspect
}
]


然后单击页面并查看将重置的内容。

步 2: 外观,您的文件中有足够的信息 cookie jar, 使用相同的技术:


Rails.configuration.log_tags = [
lambda { |req|
req.cookies.inspect
}
]


/点击请求/

此外,不要担心输入用户名/杂志中的电子邮件信件 - user ID 它足够好,您可以在数据库中观看它以获取所需的任何其他元数据。
</user_id></session_hash>

快网

赞同来自:

不幸的是,杂志标签仅在请求委派的开始时被评为一次。 /在
Rails::Rack::Logger

middleware/. 在这个阶段,没有控制器,所以任何助手 current_user 尚不可用。 没有聪明,也没有会议,但至少有 cookiejar, 所以,如果你在那里保持自己 session_id, 您可以还原会话或输入 session_id 直接地。


config.log_tags = [ lambda { |req| req.cookie_jar["_session_id"].to_s } ]


我认为最好的替代方案是保存文件中的用户名 cookie 直接B. log_in 并用会话摧毁它。


config.log_tags = [ lambda { |req| req.cookie_jar["user_name"] || 'Noone' } ]


不起作用:

但如果你使用 devise, 它使用中间软件 warden raack, 以便
env['warden']

必须可用,所以你可以尝试?


config.log_tags = [ lambda { |req| user = req.env['warden'].user; user && user.name || 'Noone'; } ]


即使没有 warden, 由于您通过了会话
env['rack.session']

, 如果在会话中存储用户ID,则可以执行类似的操作


config.log_tags = [ lambda { |req| user = User.find_by_id/req.env['rack.session']['user_id']/; user && user.name || 'Noone'; }

龙天

赞同来自:

现在完全是朋友......

https://github.com/roidrage/lo ... 09861
我刚尝试过 Rails 4, 最新发明和等级。

快网

赞同来自:

几乎为我工作了 /Rails 3.2.22.2/, - 这是从这里的答案:
http://benjit.com/rails/logger ... file/
/

它表明该物体
cookie_jar

回答
encrypted

. 但是,这不是我的。 最终为我工作的事实如下:


config/initializers/logging.rb

:


Rails.configuration.log_tags = [
lambda { |req|
session_key = Rails.application.config.session_options[:key]
session_data = req.cookie_jar.signed[Rails.application.config.session_options[:key] ]
warden_data = / session_data["warden.user.user.key"]|| [[]]/
admin_user = warden_data[0][0]
"u: #{admin_user || 0}"
}
]

莫问

赞同来自:

据说 @viktortron 在

在初始化时
log_tags

, 我们没有合适的物体。
session

, 但
session_id

位于查询中。

如果您正在使用 _database session_store_, 如在我的情况下,你可以重建

会议

ad-hoc:


session = ActiveRecord::SessionStore::Session.find_by_session_id/request.cookie_jar["_session_id"]/


这是我的方式
log_tags

:


# config/initializers/rails_log.rb
def get_user_id/req/
session = ActiveRecord::SessionStore::Session.find_by_session_id/req.cookie_jar["_session_id"]/
result = session ? session.data["user_id"] : 0

"d" % result
end

log_tags = []
log_tags << lambda { |req| Time.now.strftime/"%F %T.%L"/ }
log_tags << lambda { |req| req.uuid.first/8/ }
log_tags << lambda { |req| get_user_id/req/ }

Rails.configuration.log_tags = log_tags


结果是:


[2013-01-22 13:51:36.659] [e52435d1] [0036484] <the line="" log="">


</the>

涵秋

赞同来自:

我用

Swards, 它就像一个咒语一样。 但是,使用
begin..rescue

而不是哈希#has_key? - 性能杀手


require 'benchmark/ips'

good_hash = { 'warden.user.admin_user.key' => [[1]]}
bad_hash = {}

Benchmark.ips do |x|
x.report/'begin+rescue good hash'/ { good_hash['warden.user.admin_user.key'][0][0] }
x.report/'has_key good hash'/ do
good_hash.has_key?/'warden.user.admin_user.key'/ &&
good_hash['warden.user.admin_user.key'][0][0]
end

x.report/'begin+rescue bad hash'/ { bad_hash['warden.user.admin_user.key'][0][0] rescue nil }
x.report/'has_key bad hash'/ do
if bad_hash.has_key?/'warden.user.admin_user.key'/
bad_hash['warden.user.admin_user.key'][0][0]
end
end

# Compare the iterations per second of the various reports!
x.compare!
end


结果为自己说话


Comparison:
has_key bad hash: 4870164.1 i/s
begin+rescue good hash: 3544134.7 i/s - 1.37x slower
has_key good hash: 2127500.6 i/s - 2.29x slower
begin+rescue bad hash: 4468.2 i/s - 1089.95x slower

涵秋

赞同来自:

这是一个解码器文件 cookie, 我使用的是 Rails 5.1, 使用日志使用
user_id

, 存储在文件中 cookie. 这基本上允许我访问相同的控制器
session[:user_id]

, 来自原始文件。 cookie

environments/production.rb:


config.log_tags = [
:request_id,
:remote_ip,
lambda do |req|
session_data = CookieDecrypter.new/req/.session_data
"user_id:#{session_data['user_id']}"
end
]


app/models/cookie_decrypter.rb:


class CookieDecrypter
attr_reader :request

def initialize/request/
@request = request
end

def session_data
cookie = request.cookies[session_key]
return {} unless cookie.present?
cookie = CGI::unescape/cookie/
key_generator = ActiveSupport::KeyGenerator.new/secret_key_base, iterations: 1000/
secret = key_generator.generate_key/salt/[0, ActiveSupport::MessageEncryptor.key_len]
sign_secret = key_generator.generate_key/signed_salt/
encryptor = ActiveSupport::MessageEncryptor.new/secret, sign_secret, serializer: JSON/
encryptor.decrypt_and_verify/cookie/ || {}
end

private

def session_key
Rails.application.config.session_options[:key]
end

def secret_key_base
Rails.application.secrets[:secret_key_base]
end

def salt
Rails.application.config.action_dispatch.encrypted_cookie_salt
end

def signed_salt
Rails.application.config.action_dispatch.encrypted_signed_cookie_salt
end
end

奔跑吧少年

赞同来自:

作为一个快速而丑陋的旁路路径,可以在处理查询后写第二个字符串。

它 500 ServerError 提出了: #{username}

郭文康

赞同来自:

对于那些使用的人 Redis::Store @fjuillen's 答案如下:


redis = Redis::Store.new
redis.select 3 # only if you use a different database
result = redis.get req.cookie_jar["_session_id"]


测试 rails 4.

要回复问题请先登录注册