在设计

时间:2016-03-01 16:01:02

标签: ruby-on-rails authentication devise warden

我已经将我的轨道从3.2.8升级到轨道4,同样设计是从2.1.2升级到3.5.6并且从1.2.3升级到1.2.6。 我发现了一个问题,我不知道它应该属于设计或监护人。

在我打电话之前

resource = warden.authenticate(:scope => resource_name, :recall =>"#{controller_path}#new")

我更新了下面的params值:

params[:admin] = Hash.new 
params[:admin][:email] = params[:email] 
params[:admin][:password] = params[:password]

但是当我在proxy.rb中打印params时,函数def authenticate(* args) params仍然是原始的,没有任何管理员。

  

当我使用旧系统时,问题不会发生。

以下是我的代码和日志部分: controllers.rb

params[:admin] = Hash.new
params[:admin][:email] = params[:email]
params[:admin][:password] = params[:password]
params[:password] = '11111111111111'
# authenticate with warden
p '===================================='
p params
p warden
resource = warden.authenticate(:scope => resource_name, :recall => "#{controller_path}#new")
p params
p '===================================='

proxy.rb

def authenticate(*args)
  p 'sssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss'
  p params
  params[:password] = '111111111'
  p params
  p 'sssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss'
  user, _opts = _perform_authentication(*args)
  user
end

日志:

"===================================="
{"email"=>"syter@xxxx.com", "password"=>"11111111111111", "controller"=>"admin_sessions", "action"=>"create", "version"=>"v1", "format"=>"json", "admin"=>{"email"=>"syter@xxxx.com", "password"=>"xxxxxxxx"}}
Warden::Proxy:70145506030260 @config={:default_scope=>:admin, :scope_defaults=>{}, :default_strategies=>{:admin=>[:rememberable, :database_authenticatable]}, :intercept_401=>false, :failure_app=>#Devise::Delegator:0x007f980f873e18}
"sssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss"
{"email"=>"syter@xxxx.com", "password"=>"xxxxxxxx", "controller"=>"admin_sessions", "action"=>"create", "version"=>"v1", "format"=>"json"}
{"email"=>"syter@xxxx.com", "password"=>"111111111", "controller"=>"admin_sessions", "action"=>"create", "version"=>"v1", "format"=>"json"}
"sssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss"
"sssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss"
{"email"=>"syter@xxxx.com", "password"=>"111111111", "controller"=>"admin_sessions", "action"=>"create", "version"=>"v1", "format"=>"json"}
"sssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss"
{"email"=>"syter@xxxx.com", "password"=>"11111111111111", "controller"=>"admin_sessions", "action"=>"create", "version"=>"v1", "format"=>"json", "admin"=>{"email"=>"syter@xxxx.com", "password"=>"xxxxxxxx"}}
"===================================="

似乎有两个参数,一个在控制器中,一个在监狱中。

我错过了任何配置或其他任何事情吗?

希望你的答案, 谢谢你。

1 个答案:

答案 0 :(得分:2)

当我在这里询问并回答类似问题时,我没有看到这个问题https://stackoverflow.com/a/40512141/208769

令人讨厌的是,您在控制器中看到的params似乎是机架维护的params的克隆,而不是对它的引用。并且因为warden在中间件层中拦截请求,所以它保持与请求参数的链接,并且对控制器的克隆一无所知。

简而言之,如果您想修改参数并让监护人看到您的修改,则需要修改request.params