【问题标题】:How to setup a default current_user for demo purposes如何为演示目的设置默认 current_user
【发布时间】:2013-03-15 15:02:28
【问题描述】:

我设置了一个假用户来演示我的应用。这个想法是,不会登录的访问者应该仍然能够看到真实用户将拥有的所有功能。当未登录的访问者访问该站点时,该应用将登录演示用户,访问者将看到属于该演示用户的虚假数据。

考虑到这个目标,我这样设置我的应用程序控制器。

class ApplicationController < ActionController::Base
  protect_from_forgery
  before_filter :set_current_user

  def demo_user
    @demo_user ||= User.find_by_email("demo@example.com")
  end

  protected
    def set_current_user
      if current_user.nil?
        sign_in(demo_user)
      end
    end
end

我的问题是我不小心让真实用户无法登录。只要真实用户按下“登录”链接,他们就会被告知他们已经登录(作为演示用户)。

很明显,我所做的与“最佳实践”相去甚远。在这种情况下,聪明的程序员会怎么做?如何让我漂亮的自动登录演示用户保持登录状态,但仍让真实用户登录?

【问题讨论】:

  • 那你为什么需要一个假用户呢?什么是非登录用户看不到而登录用户可以看到的内容?您如何阻止未登录的用户看不到它?您还使未登录用户可以轻松地执行真实用户可以执行的任何操作(即创建帖子、删除帖子等)。
  • 如何添加另一个带有登录演示用户的按钮,这样您就不必弄乱之前的过滤器了?

标签: ruby-on-rails devise


【解决方案1】:

您需要将:except 添加到您的:before_filter,以便它不会在登录操作上运行,无论它是什么。假设您使用的是设计,那就是SessionsController#new,所以它看起来像:

before_filter :set_current_user, :except => :new

请注意,这将跳过所有“新”操作的过滤器,因此更有针对性的方法是(再次假设您使用的是设计)创建一个自定义的 SessionsController,它继承自 Devise::SessionsController 和将其留空,除了:

skip_before_filter :set_current_user, :only => [:new, create]

【讨论】:

  • 使用 Devise,您可能需要同时定位 :new:create
  • 这绝对是有道理的。但我认为我可能需要做更多的事情。我什至无法获得登录页面。当我单击新会话的链接时,我仍然收到我已经登录的消息。我重新启动了我的服务器,以防万一,但我仍然得到相同的行为。
  • 您可以为注销当前用户的sessions_controller#new 操作添加before_filter
  • 您是否在 config/routes.rb 中设置了使用自定义控制器的设计?你需要有这样的东西:devise_for :users, :controllers =&gt; { :sessions =&gt; "devise/sessions" },然后在app/controllers/devise/sessions_controller.rb中创建你的自定义控制器
  • 控制器设置正确。我真的很困惑为什么我会遇到这些麻烦。 skip_before_filter 似乎可以完美运行。
【解决方案2】:

您的set_current_user 函数位于before_filter 中,这意味着它为每个请求运行一次。 current_user 将是 nil 任何人第一次访问,因此他们将作为演示用户登录。您可以跳过 before_filtersessions_controller#create 操作(或在您的应用中调用的任何内容。例如,如果您使用的是 Devise:

class SessionsController < Devise::SessionsController
  skip_before_filter :set_current_user, :only => :create
end

【讨论】:

    【解决方案3】:

    这就是我最终的结果。我从 Omnikron 的解决方案开始,但我需要更多。

    这篇文章有帮助:https://groups.google.com/forum/#!msg/plataformatec-devise/0WylcwjSAJY/ITDF6kFjJvwJ

    class SessionsController < Devise::SessionsController
      skip_before_filter :set_current_user, only: [:new, :create]
      skip_before_filter :require_no_authentication, :only => [:new, :create]
    
      def new
        if user_signed_in?
          sign_out current_user
          redirect_to new_user_session_path
        else
          super
        end
      end
     end
    

    【讨论】:

      猜你喜欢
      • 2012-02-18
      • 1970-01-01
      • 2021-08-19
      • 2016-04-25
      • 1970-01-01
      • 2018-03-22
      • 2016-02-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多