我有我的银行控制器
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进行身份验证。我的问题来自于任何用户只需从登录响应中获取访问令牌就可以更新另一个用户的银行对象。
是否有干净/安全/自动的方式阻止用户与其他人的详细信息进行交互? 或者我应该确保我更新的银行对象属于登录用户?
非常感谢
答案 0 :(得分:1)
您的混合身份验证和授权。
Authentication关注用户的身份。
Authorization是一组规则,允许谁在您的应用程序中执行操作。
Devise提供身份验证,您可以创建自己的授权系统或使用库(推荐),例如Pundit或CanCanCan。
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