Rails - 为用户帐户创建密钥持有者 - 访问限制问题

时间:2013-02-28 12:00:12

标签: ruby-on-rails permissions

我想创建一个应用程序,用户可以在其中指定一个“密钥持有者”,该密钥持有者可以拥有对其帐户的只读权限。我正在使用Devise进行用户身份验证。另外,我在数据库中有布尔字段来确定登录的用户是否是密钥持有者,还有一个'access_id'整数字段,等于允许他们访问的用户的用户ID。

我正在尝试创建访问限制,以便只有用户或其密钥持有者才能访问其帐户(而不仅仅是在地址栏中输入用户编号的任何人)。我稍后将根据用户角色进一步限制访问,但是我当前收到以下错误:

ActiveRecord::RecordNotFound in UsersController#myaccount 
Couldn't find User without an ID

它指的是我添加到application_controller.rb的代码:

class ApplicationController < ActionController::Base
  protect_from_forgery
  before_filter :correct_user


    private

      def correct_user
        @user = User.find(params[:id])
        @keyholder = User.find(params[:access_id])

        redirect_to(root_path) unless current_user==@user||@keyholder
      end
end

它给出了这一行的错误:

@keyholder = User.find(params[:access_id])

此外,以下是用户控制器中#myaccount操作的代码:

def myaccount
    if user_signed_in?
    @user = User.find(params[:id])

    respond_to do |format|
      format.html # show.html.erb
      format.json { render json: @user }
    end
    else
      redirect_to root_path, notice: 'Please login to view your account'
    end
  end

对于数据库中的所有记录,我将access_id设置为0,但密钥持有者除外,其中访问ID等于允许他们访问的user_id。

任何人都可以帮我吗?在我进一步限制权限之前,我只是希望合适的人能够访问帐户。谢谢!

更新:

如果我将代码更改为:

def correct_user
        @user = User.find(params[:id])

        redirect_to(root_path) unless current_user==@user
      end

那么用户只能访问他们自己的帐户,这很好,但我需要一种方法让密钥持有人能够访问该帐户。

1 个答案:

答案 0 :(得分:0)

此行@keyholder = User.find(params[:access_id])导致错误,因为您使用的是find。您可以将其更改为

@keyholder = User.find_by_id(params[:access_id])
#or
@keyholder = User.where(id: params[:access_id]).first

当他们找不到密钥持有者时,都会返回nil

更新:

假设access_id包含可以访问@user的用户的id,您可以使用以下内容进行检查

if @user && current_user.id == @user.id
  # don't redirect
elsif @keyholder && current_user.id == @keyholder.access_id
  # don't redirect
else
  # redirect
end

简化,我们有

unless (@user && current_user.id == @user.id) || (@keyholder && current_user.id == @keyholder.access_id)
  # redirect
end