【问题标题】:making Session mandatory in a Rails app在 Rails 应用程序中强制使用 Session
【发布时间】:2017-05-25 13:06:39
【问题描述】:

我想这样做,以便必须存在会话才能使用网站。如果不是,则重定向到根路径,以便用户可以选择是否以访客身份浏览站点、登录或注册。我正在使用基于 Railscast 的从头开始的基本身份验证。

在应用控制器中

class ApplicationController < ActionController::Base
  # Prevent CSRF attacks by raising an exception.
  # For APIs, you may want to use :null_session instead.
  protect_from_forgery with: :exception
  before_action :set_artists
  before_filter :check_session
  helper_method :current_user

  private
        def set_artists
            @artists = Artist.all
        end

    def current_user
      @current_user ||= User.find(session[:user_id]) if session[:user_id]
    end

    def check_session
      unless current_user
        redirect_to root
      end
    end
end

我有一个访客用户登录,然后通过 Rails 控制台清除了所有访客用户:User.where(guest: true).destroy_all。我有一个 rake 任务可以清除 1 天前的访客会话,所以这将是一个非常典型的情况。之后尝试重新加载,错误出现:Couldn't find User with 'id'=8

【问题讨论】:

  • 您需要使您的 cookie 无效或从浏览器中删除。您可以通过更改 the secret key base 来使所有现有 cookie 失效。
  • 您可能还想阅读how sessions work in Rails,因为“需要会话”的整个概念是错误的。 Rails 应用程序的每个访问者都会获得一个会话——但只有那些允许 cookie 的访问者才能在初次访问后“回收”一个会话。您可能的意思是使身份验证成为强制性的。 (访客用户也是一种身份验证形式)。
  • 有什么好的方法可以确保作为访客身份验证在时间到来时被清除,用户不会因为他们的 cookie 而遇到这样的崩溃?

标签: ruby-on-rails session authentication


【解决方案1】:

问题是你的用户会保留他们的cookies,所以当你运行时:

def current_user
  @current_user ||= User.find(session[:user_id]) if session[:user_id]
end

用户仍然拥有带有:user_id 的会话cookie,并且对User.find 的调用未能找到现在已删除的用户。

一个解决方案是用一个可能失败的调用来替换它,例如:

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

如果找不到Userfind 将引发异常,find_by 只会返回nil,而您的current_user 为空。

话虽如此,我同意前面的评论者的观点,即这并不是真正的“Rails 方式”。每天删除所有来宾用户可能不是获得所需行为的最佳方式。

相反,一个想法是您可以向 User 模型添加一个时间戳,指示用户上次被要求作为访客验证的时间,然后如果超过 24 小时,您可以将访客用户退回到提示他们注册的页面。您不必删除他们的User 条目;你可以在他们重新注册时重复使用它。

【讨论】:

  • 感谢您的回复!最终发生的事情是 Chrome 开始给我“重新加载太多,清除你的 cookie”消息(我在解释),在清除 cookie 后它并没有消失。您对current_user 的更正似乎没有解决它。我刚刚注释掉了 session_check 的内容,并以另一个访客用户身份重新登录以重新访问该应用程序。所以,我在这里做错了。似乎find_by 返回nil 也会导致问题,因为即使回到用户可以选择成为访客的屏幕仍然需要current_user 成为某物。
  • 这应该是一个演示项目,我将在我的实习申请中使用它。这似乎不是一个功能的关键,首先从概念上更好地理解它需要一些时间。所以,我正在考虑暂时放弃这个。
猜你喜欢
  • 1970-01-01
  • 2011-08-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-09
  • 2016-07-17
  • 2011-05-16
  • 1970-01-01
相关资源
最近更新 更多