我必须构建只有注册用户才能访问的网站。作为一名经验不足的RoR开发人员,我尝试设置Railscasts episode #250中描述的身份验证系统,并计划使用Cancan作为授权系统。使用Cancan check_authorization 时,我遇到了 current_user 变量的问题,这是在 application_controller.rb 中的私有帮助器方法中定义的:
def current_user
@current_user ||= User.find(session[:user_id]) if session[:user_id]
end
看起来它在每个其他控制器中的cancan check_authorization 方法都是不可见的,因为它被置于任何操作之外(谢谢调试器gem)。
现在任何用户(无论他是否登录)都可以访问登录和注册页面(OK),但是每个人都无法访问我已经定义的控制器 check_authorization 中的任何其他操作(并且此方法必须存在于所有这些)(不行)
问题是:使用rails约定解决此问题的最佳方法是什么?
替代方案是对每个操作使用cancan authorize!方法,但它看起来不正确。此外,当我使用devise gem时,没有像这样的问题,但对我而言,使用这种身份验证系统对于像我这样的轻型项目而言过于沉重。
答案 0 :(得分:1)
根据您的问题我认为您想要使用您在应用程序控制器中定义的current_user方法授权控制器中的某些操作(如果我错了,请更正我)。您可以做的是使用before filter
并在控制器中定义一个私有方法,以检查当前用户是否存在,如果它不是,那么只需重定向到根页
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
答案 1 :(得分:0)
在您的控制器中使用before_filter
,如下所示:
before_filter :current_user
这将在控制器中的每个操作之前运行该方法。如果需要,您可以添加:only
或:except
以包含或排除某些方法。