2016-10-18 5 views
1

У меня есть банки Контроллервопрос безопасности с контроллером

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 

Я использую разработать для аутентификации. Моя проблема связана с тем, что любые пользователи могут обновлять банковский объект другого пользователя, просто получая токен доступа из ответа на вход.

Есть ли чистый/безопасный/автоматический способ предотвращения взаимодействия пользователя с чужими деталями? или я должен просто убедиться, что объект банка, который я обновляю, принадлежит зарегистрированному пользователю?

большое спасибо

+1

Если у вас есть отношения для пользователя и user_bank, то вы можете использовать current_user.user_banks.find() – Zero

ответ

1

Ваше совмещение аутентификации и авторизации.

Authentication связан с личностью пользователя.

Authorization - это набор правил для тех, кому разрешено делать то, что в вашем приложении.

Разрабатывают обеспечивает аутентификацию, вы можете создать свою собственную систему авторизации или использовать библиотеку (рекомендуется), такие как Pundit или CanCanCan.

Hacky домой прокатке проверка авторизации будет выглядеть следующим образом:

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 
+0

Если вы не знаете, это вы должны остаться вдали от программирования любого банковского дела. Просто говорю' – max

Смежные вопросы