控制器的安全问题

时间:2016-10-18 16:30:47

标签: ruby-on-rails devise

我有我的银行控制器

class Api::V1::BanksController < ApplicationController
  before_action :authenticate_user!
  respond_to :json

  # PUT /api/v1/banks/:id.json
  def update
    @bank = UserBank.find_by!(uuid: params[:id])

    if @bank.update_attributes bank_params
      render json: @bank
    else
      render json: @bank.errors, status: :unprocessable_entity
    end
  end

  private

  def bank_params
     params.require(:bank).permit(:iban, :bic)
  end
end

我使用devise进行身份验证。我的问题来自于任何用户只需从登录响应中获取访问令牌就可以更新另一个用户的银行对象。

是否有干净/安全/自动的方式阻止用户与其他人的详细信息进行交互? 或者我应该确保我更新的银行对象属于登录用户?

非常感谢

1 个答案:

答案 0 :(得分:1)

您的混合身份验证和授权。

Authentication关注用户的身份。

Authorization是一组规则,允许谁在您的应用程序中执行操作。

Devise提供身份验证,您可以创建自己的授权系统或使用库(推荐),例如PunditCanCanCan

hacky home Rolling授权检查看起来像:

class AuthorizationError < StandardError; end

class ApplicationController
  rescue_from AuthorizationError, with: :deny_access

  def deny_access
    head :unauthorized and return
  end
end

class Api::V1::BanksController < ApplicationController
  before_action :authenticate_user!
  before_action :set_bank!
  before_action :authorize!
  respond_to :json

  # PUT /api/v1/banks/:id.json
  def update
    @bank = UserBank.find_by!(uuid: params[:id])
    respond_with @bank.update(bank_params)
  end

  private
  def set_bank!
    @bank = UserBank.find_by!(uuid: params[:id])
  end

  def authorize!
    # this is the authorization rule.
    unless @bank.user == current_user
      raise AuthorizationError 
    end
  end

  def bank_params
     params.require(:bank).permit(:iban, :bic)
  end
end