gpt4 book ai didi

ruby-on-rails - 无法在 Rails 中正确删除 session

转载 作者:太空宇宙 更新时间:2023-11-03 17:14:39 25 4
gpt4 key购买 nike

遵循 ruby​​ on rails 教程 ( https://www.railstutorial.org/book/log_in_log_out )。注销功能不工作。我生成了一个“ session ” Controller ,并定义了一个方法销毁到“log_out”,“current_user”是一个实例变量,在调用 log_out 方法时更改为 nil。 sessions_helper.rb 中的“log_out”方法。

module SessionsHelper
def log_in(user)
session[:user_id] = user.id
end

def remember(user)
user.remember
cookies.permanent[:remember_token] = user.remember_token
cookies.permanent.signed[:user_id] = user.id
end

def current_user
if (user_id = session[:user_id])
@current_user ||= User.find_by(id: session[:user_id])
elsif (user_id = cookies.signed[:user_id])
user = User.find_by(id: user_id)
if user && user.authenticated?(cookies:[:remember_token])
log_in user
@current_user = user
end
end
end

def logged_in?
!current_user.nil?
end

def log_out
debugger
session.delete(:user_id)
@current_user = nil
end
end

我使用 DELETE 请求“/logout”。

 delete 'logout' => 'sessions#destroy'

View 中布局的相关部分

<% if logged_in? %>
<ul class="text-center nav navbar-nav navbar-right">
<li class="dropdown">
<a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false">Account <span class="caret"></span></a>
<ul class="text-center dropdown-menu">
<li class="text-center"><%= link_to "Profile", current_user %></li>
<li class="text-center"><%= link_to "Settings", "#" %></li>
<li role="separator" class="divider"></li>
<li class="text-center"><%= link_to "Log Out", logout_path, :method => :delete %></li>
</ul>
</li>
</ul>
<% else %>
<li><a id="signin" href="/login">Sign In</a></li>
<% end %>

我相信 log_out 方法不起作用,因为 View 没有改变,根据行 <% if logged_in? %> , logged_in 方法应该防止在删除 session 时呈现 View 的一部分。在哪里“logged_in?”方法在 sessions_helper.rb 中定义,如果用户已登录,它会返回一个 bool 值 true。

整个路线.rb

Rails.application.routes.draw do

root 'static_pages#home'
get 'about' => 'static_pages#about'
get 'help' => 'static_pages#help'
get 'signup' => 'users#new'
get 'login' => 'sessions#new'
post 'login' => 'sessions#create'
delete 'logout' => 'sessions#destroy'
resources :users
end

整个session_controller.rb

class SessionsController < ApplicationController

def new
end

def create
user = User.find_by(email: params[:session][:email].downcase)
if user && user.authenticate(params[:session][:password])
log_in user
remember user
redirect_to user
else
flash.now[:danger] = 'Invalid email/password combination'
render 'new'
end
end

def destroy
log_out
end
end

整个session_helper.rb

module SessionsHelper
def log_in(user)
session[:user_id] = user.id
end

def remember(user)
user.remember
cookies.permanent[:remember_token] = user.remember_token
cookies.permanent.signed[:user_id] = user.id
end

def current_user
if (user_id = session[:user_id])
@current_user ||= User.find_by(id: session[:user_id])
elsif (user_id = cookies.signed[:user_id])
user = User.find_by(id: user_id)
if user && user.authenticated?(cookies:[:remember_token])
log_in user
@current_user = user
end
end
end

def logged_in?
!current_user.nil?
end

def log_out
session.delete(:user_id)
@current_user = nil
end
end

最佳答案

在 Rails 中注销用户的正确方法是 by invalidating the session .

def log_out
reset_session
@current_user = nil
end

session 在 Rails 中的工作原理是,访问者在首次访问该站点时会收到一个带有 session ID(散列)的 cookie。这链接到一个存储的 session (也是一个 cookie)并且 Rails 跟踪哪些 session ID 是有效的。

reset_session 使服务器上的 session ID 无效,如果您想避免 session 固定和重放攻击之类的事情,这非常重要。它还会发布一个新的 session ID。

执行 session.delete(:user_id) 只会操作客户端持有的 session 存储 cookie。因此,如果客户端例如发送一个旧的 cookie,他们仍然会登录!

Then why is it not in the tutorial?

米。 Hartl 的 Rails 教程一书没有得到官方认可,虽然它很好地解释了关键概念,但它包含的内容相当多,这是非常值得怀疑的。

关于ruby-on-rails - 无法在 Rails 中正确删除 session ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36956552/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com