Ruby on rails 如何从Rails控制台使用Desive登录用户?

Ruby on rails 如何从Rails控制台使用Desive登录用户?,ruby-on-rails,console,devise,Ruby On Rails,Console,Devise,加载Rails控制台后,我应该如何登录用户 Desive提供了一个可以在测试中使用的测试助手,我曾尝试在console中使用: >> include Devise::TestHelpers >> helper.sign_in(User.first) 但我得到: NoMethodError: undefined method `env' for nil:NilClass 无论如何,我想使用真正的Desive助手,而不是这个测试助手。有什么方法可以做到这一点吗?我有一种方

加载Rails控制台后,我应该如何登录用户

Desive提供了一个可以在测试中使用的测试助手,我曾尝试在console中使用:

>> include Devise::TestHelpers
>> helper.sign_in(User.first)
但我得到:

NoMethodError: undefined method `env' for nil:NilClass

无论如何,我想使用真正的Desive助手,而不是这个测试助手。有什么方法可以做到这一点吗?

我有一种方法可以做到:

>> ApplicationController.allow_forgery_protection = false
>> app.post('/sign_in', {"user"=>{"login"=>"login", "password"=>"password"}})
然后你可以做:

 >> app.get '/some_other_path_that_only_works_if_logged_in'
 >> pp app.response.body

这里是另一个使用csrf令牌、验证用户并发出POST/GET请求的示例

# get csrf token
app.get  '/users/sign_in'
csrf_token = app.session[:_csrf_token]

# log in
app.post('/users/sign_in', {"authenticity_token"=>csrf_token, "user"=>{"email"=>"foo", "password"=>"bar"}})

# get new csrf token, as auth user
app.get ''
csrf_token = app.session[:_csrf_token]

# make a POST request
app.post '/some_request.json', {"some_value"=>"wee", "authenticity_token"=>csrf_token}

# make a GET request
app.get '/some_other_request.json'

您可以在一个控制器中添加一个操作,并使用所解释的技术

class MyController
重要的是要注意,从那时起,参数解析已更改为只接受一个参数和参数(而不是第二个参数)

ActionDispatch::ParamSpaser已弃用,并已从中间件堆栈中删除。若要配置参数解析器,请使用ActionDispatch::Request.parameter_解析器=

因此,如果不修补中间件,这些早期示例将无法在现代Rails中工作。要使它们工作,只需在POST参数中包含参数,如:


app.post('/users/sign_in',{“user”=>{“email”=>“me@mail.com“,”密码“=>”密码“}})
{”电子邮件“=>”me@mail.com“,”password“=>”mycolpassword“}})有一种更好的方法。将此代码添加到config/application.rb

#config/application.rb
类应用程序
现在,您可以代表任何用户登录:

$current\u user=user.last
app.get'/backdoor'#登录
app.get'/profile'#任何其他请求
对于HTTPS,可能需要使用完整主机名:

app.get 'https://localhost/backdoor'

这并不能真正回答问题,因为问题是关于从控制台登录iin,而不是作为另一个用户从web应用程序登录。但它仍然很有用,您也可以从控制台调用此方法。我在这里通过谷歌搜索,是的,上面的答案很好,很有效,但这一条对我也很有帮助。所以不要总是给这样的人投反对票。有没有办法在控制台上使用sign_-in?由于我需要生成令牌访问,但这将在使用modern Device登录后发生,因此您必须使用
电子邮件
而不是
登录
app.post('/sign_in',{“user”=>{“email”=>“login”,“password”=>“password”}})
在此上下文中,“app”是如何初始化的?启动控制台时,app会初始化。你不需要做任何额外的事情。我必须使用
app.post('/users/sign_-in',{params:{“email”=>“[FILTERED]””,“password”=>“[FILTERED]”})
,但在其他方面效果很好!关于
防伪的那一点
会让我耽搁一整天!一个古老的答案,但仍然是。这是适合我的!将参数传递到app.post的语法已更改为
app.post'/users/sign_in',参数:{“authenticity_token”=>csrf_token,…。
对于Rails 6,您可能需要将
config.hosts.clear
添加到development.rb文件中-
app.get 'https://localhost/backdoor'