2013-05-12 3 views
0

Использование рельсов 3.2. Я пытаюсь защитить свое приложение, проверяя разрешение пользователя на все crud-действия. Вот один из примеров:Обтекание внутри фильтра

class StatesController < ApplicationController 
    def create 
    @country = Country.find(params[:country_id]) 
    if can_edit(@country) 
     @state.save 
    else 
     redirect_to country_path 
    end 
    end 

    def destroy 
    @country = Country.find(params[:country_id]) 
    if can_edit(@country) 
     @state = State.find(params[:id]) 
     @state.destroy 
    else 
     redirect_to country_path 
    end 
    end 
end 

class ApplicationController < ActionController::Base 
    def is_owner?(object) 
    current_user == object.user 
    end 

    def can_edit?(object) 
    if logged_in? 
     is_owner?(object) || current_user.admin? 
    end 
    end 
end 

Я заметил, что я был оберточной can_edit? во многих контроллерах. Есть ли способ DRYER для этого?

Примечание: Все должны включать объект, чтобы проверить, является ли зарегистрированный пользователь владельцем.

ответ

0

Вы ищете библиотеку авторизации. Вы должны посмотреть на CanCan, который позволяет вам установить определенные правила, по которым объекты могут быть доступны конкретными пользователями или группами пользователей.

У этого метода есть load_and_authorize_resource, который вы можете вызвать в данном контроллере. Так что ваш контроллер статуи будет выглядеть так:

class StatesController < ApplicationController 
    load_and_authorize_resource :country 

    def create 
    @state.save 
    end 

    def destroy 
    @state = State.find(params[:id]) 
    @state.destroy 
    end 
end 

канкан сначала загрузить страну и определить, имеет ли пользователь право на просмотр этого ресурса. Если нет, это вызовет ошибку (которую вы можете спасти в этом контроллере или ApplicationController, чтобы вернуть соответствующий ответ). Затем вы можете получить доступ к @country в любом действии контроллера, зная, что пользователь имеет на это право.

+0

I сначала использовал CanCan, но обнаружил, что я не могу легко настроить перенаправление ошибок, это не так гибко. Поэтому я решил работать над ним вручную. – Victor

+0

Используйте метод Rails rescue_from для этого: http://api.rubyonrails.org/ классы/ActiveSupport/Rescuable/ClassMethods.html – Chris

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