【问题标题】:User session not maintaining用户会话未维护
【发布时间】:2017-04-30 07:53:10
【问题描述】:

用户可以正常登录,但切换到另一个页面时,会话结束。正如您在gif 中看到的那样,导航栏会发生变化,就好像用户已注销,并且 current_user 不再处于活动状态。在主页上,欢迎后应该显示名字,但不是。

知道为什么会这样吗?干杯。

会话控制器

class LoginsessionsController < ApplicationController

def new
end

def show
end

def create
@user = User.find_by(email: params[:loginsessions][:email].downcase)
if @user && @user.authenticate(params[:loginsessions][:password])
  session[:user_id] = @user.id
  sign_in(@user)
  redirect_to @user
 else
  flash[:notice] = "Invalid email or password"
  render 'new'
 end
end

def destroy
 signout
 session[:user_id] = nil
  respond_to do |format|
   format.html { redirect_to "http://localhost:3000/" , notice: 'You have 
   successfully signout!.'}
  end
 end
end

会话助手

module LoginsessionsHelper

 def sign_in(user)
 remember_token = User.new_remember_token
 cookies.permanent[:remember_token] = remember_token
 user.update_attribute(:remember_token, User.encrypt(remember_token))
 self.current_user = @user
 session[:user_id] = @user.id
 end

 def current_user=(user)
  @current_user = @user
 end

def current_user
 remember_token = User.encrypt(cookies[:remember_token])
 @current_user ||= User.find_by(id: session[:user_id])
end

 def signed_in?
 !current_user.nil?
 end

def signout

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

用户控制器

  class UsersController < ApplicationController
  def index
   @user = User.new
  end
  def show
  @user = User.find(params[:id])
  #unless session[:user_id] == @user.id
 #  redirect_to "http://localhost:3000/loginsessions/new"
 #flash[:notice] = "You do not have access and have been logged out"
 #end
  end

 def new
@user = User.new
 end

 def create
@user = User.new(users_params)
if @user.save
  sign_in @user
  redirect_to @user
else
  render 'new'
end
 end

 def destroy
signout
session[:user_id] = nil
respond_to do |format|
  format.html { redirect_to "http://localhost:3000/loginsessions/new" , 
  notice: 'You have successfully signout!.'}
  end
  end

 private
  def users_params
params.require(:user).permit(:firstName, :lastName, :email, :password, 
:remember_token)
  end
  end

Application.html相关代码

   <% if current_user.present? %>
      <li><%= link_to "Sign out", signout, method: "delete" %></li>
      <li class="trail"><a href="/users/new">Settings</a></li>

      <% else %>
      <li><a href="/loginsessions/new">Login</a></li>
      <li class="trail"><a href="/users/new">Signup</a></li>
      <% end %>

索引(主页)

  <h1 class="welcomeMessage">Welcome
  <% if current_user.present? %>
   <%= current_user.firstName%>

 <% end%></h1>

【问题讨论】:

  • 您似乎没有正确地将remember_token 保留在您的session 中,因此它可能会被丢弃。

标签: ruby-on-rails ruby session-cookies


【解决方案1】:

我想我找到了问题所在。在LoginsessionsHelper#sign_in 中,变量@user 未定义。 current_user= 方法也有同样的问题。我认为他们应该改变如下:

def sign_in(user)
  remember_token = User.new_remember_token
  cookies.permanent[:remember_token] = remember_token
  user.update_attribute(:remember_token, User.encrypt(remember_token))
  self.current_user = user
  session[:user_id] = user.id
end

def current_user=(user)
  @current_user = user
end

【讨论】:

  • 啊,好的!当用户访问UsersController时,你在哪里通过检查验证cookie来设置current_user?通常这是在ApplicationController 中完成的。让我更新我的答案。
  • 抱歉,我现在看到了。您可以将def current_user 和def signed_in? 移动到ApplicationController。那么,为了帮助调试,是否可以在后续请求调用current_user方法时打印出session[:user_id]?
  • 谢谢你的回复,我把它们移过来了,但还是有同样的问题。在我从用户页面切换到主页后查看控制台,这就是结果。 link。用户登录其页面时不会出现 IS NULL。
  • 您有config/initializers/session_store.rb 文件吗?我的里面有这样的东西:Rails.application.config.session_store :cookie_store, key: '_myapp_session'
  • 是的,它只包含Rails.application.config.session_store :cookie_store, key: '_LibrarySystem_session'
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-05-20
  • 1970-01-01
  • 2012-10-29
  • 1970-01-01
  • 1970-01-01
  • 2013-06-24
  • 2015-12-20
相关资源
最近更新 更多