【问题标题】:Rails & Devise: How to authenticate specific user?Rails & Devise:如何验证特定用户?
【发布时间】:2011-07-26 11:59:36
【问题描述】:

我是第一次将 Devise 与 rails 一起使用,但我遇到了一件麻烦事: 我在用户的控制器中使用了提供的authenticate_user! 方法来限制对页面的访问,如下所示: before_filter :authenticate_user!, :only => [:edit, :show, :update, :create, :destroy]

但这允许任何登录用户访问任何其他用户:edit 操作,我想仅限于该用户。我该怎么做?

【问题讨论】:

    标签: ruby-on-rails-3 authentication devise


    【解决方案1】:

    在您的编辑方法中,您需要检查用户是否拥有该记录:

    def edit
       @record = Record.find(params[:id])
       if @record.user == current_user
          @record.update_attributes(params[:record])
       else
          redirect_to root_path
       end
    end
    

    【讨论】:

    • 嗨,我刚试过这个。我收到以下错误:uninitialized constant UsersController::Record 另外,我发现像这样一个完善的身份验证方法没有直接支持这样的东西真的很令人惊讶。
    • 澄清一下,这就是我所做的:private def verify_ownership @record = Record.find(params[:id]) if @record.user == current_user return true else return false end 然后我在控制器顶部使用了before_filter
    • 用您的实际型号名称替换 Record。我还假设您的模型有一个 user_id 列。您可以使用 CanCan 或声明式身份验证。或者只是使用 if-then-else 语句来确保适当的权限。设计处理身份验证,而不是角色。
    • 我尝试将Record 替换为User,然后检查是否为@record == current_user,但由于某种原因,这仍然允许任何用户编辑任何其他用户的记录
    • 忘记我所说的before_filter,你需要重定向而不是返回真/假。把代码拿出来放到实际的方法中。
    【解决方案2】:

    您应该查看 CanCan 等授权。或者像这样创建一个新方法:

    # Create an admin boolean column for your user table.
    
    def authenticate_admin!
      authenticate_user! and current_user.admin?
    end
    

    【讨论】:

    • 我想你误解了我的问题。我不需要可以编辑任何用户记录的管理员用户。我只需要限制用户只能修改他们自己的记录。
    • 他确实有点误会了,但你还是应该考虑使用 CanCan。您正在寻找授权,而 CanCan 做得很好。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-02
    • 2014-08-14
    • 2011-05-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多