Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 在RubyonRails3中自定义控制器的任何操作之外使用当前用户_Ruby On Rails_Ruby_Ruby On Rails 3_Authentication_Cancan - Fatal编程技术网

Ruby on rails 在RubyonRails3中自定义控制器的任何操作之外使用当前用户

Ruby on rails 在RubyonRails3中自定义控制器的任何操作之外使用当前用户,ruby-on-rails,ruby,ruby-on-rails-3,authentication,cancan,Ruby On Rails,Ruby,Ruby On Rails 3,Authentication,Cancan,我必须建立一个只有注册用户才能访问的网站。作为一名经验不足的RoR开发人员,我尝试设置中描述的身份验证系统,并计划将其用作授权系统。在使用Cancan check\u authorization时,我对当前的用户变量有一个问题,该变量在应用程序\u controller.rb的私有助手方法中定义: def current_user @current_user ||= User.find(session[:user_id]) if session[:user_id] end 而且它看起来对其

我必须建立一个只有注册用户才能访问的网站。作为一名经验不足的RoR开发人员,我尝试设置中描述的身份验证系统,并计划将其用作授权系统。在使用Cancan check\u authorization时,我对当前的用户变量有一个问题,该变量在应用程序\u controller.rb的私有助手方法中定义:

def current_user
  @current_user ||= User.find(session[:user_id]) if session[:user_id]
end
而且它看起来对其他所有控制器中的cancan check_授权方法都是不可见的,因为它位于任何操作之外(谢谢你)。
现在,任何用户(无论是否登录)都可以访问登录和注册页面(OK),但每个人都不能访问我定义的check_authorization控制器中的任何其他操作(此方法必须出现在所有控制器中)(not OK)
问题是:使用rails约定解决此问题的最佳方法是什么
另一种选择是使用cancan授权!方法,但它看起来不正确。另外,当我使用Devage gem时,没有出现类似的问题,但对我来说,对于像我这样的轻型项目,使用此身份验证系统似乎过于繁重。

在控制器中使用
前过滤器

before_filter :current_user

这将在控制器中的每个操作之前运行该方法。您可以包含
:仅包含
:除非需要包含或排除某些方法。

根据您的问题,我认为您希望使用您在应用程序控制器中定义的当前用户方法授权控制器中的某些操作(如果我错了,请纠正我)。您可以使用并在控制器中定义一个私有方法来检查当前用户是否存在,如果不存在,则只需重定向到根页面

class UserController
对不起,您有什么问题?如果您的应用程序_controller.rb中有当前的_user方法,那么您应该能够在继承自的所有控制器中使用它ApplicationController@Mandeep,我也这么认为,但通过使用调试器gem,发现当前_用户只存在于'def index'之后和'end'之前(或任何其他代替index的操作)。您不能在“class users controller中说,对我来说,对于像我这样的轻型项目来说,使用此身份验证系统似乎过于繁重
所以认为您想自己动手做。我说的是Desive和类似的身份验证系统(大多难以配置。有很多选项等),可以用简单的电子邮件和密码身份验证代替。CanCan是,我认为使用它是正确的选择(它有一些好处)。不过,谢谢你的回答。我会将其标记为已接受,直到有使用cancan gem的解决方案。@VladRoker如果您想要简单的身份验证,那么为什么要使用cancan或Desive。制作你自己的认证系统,在这个过程中你也会学到很多东西。有一个从头开始的身份验证railcast。事实上,在rails 4中,使用has_secure_密码更简单。cancan的好处是所有用户的能力都存储在同一个地方(app/models/ability.rb)。我可以在before_filter中定义授权,但是对于每个控制器,没有像can和cannot这样的cancan方法。
class UserController < ApplicationController
  before_action :authenticate, except: [:index, :show] #list your actions in except array where you don't want to check for current user

  private

  def authenticate
    redirect_to your_path, notice: "You must login first" if !current_user  # if current user doesn't exist it will redirect to your path with notice
  end
end