2012-01-15 3 views
1

Я пытаюсь ограничить доступ к проектам, которые пользователь не создал. Это, кажется, работает хорошо с:Rails 3.2 CanCan - Ограничение доступа к проектам url not Owned

if user.has_role?(:Student) 
    can :create, Project 
    can :manage, Project, :user_id => user.id 
end 

(Side Вопрос: Есть ли лучший способ, чтобы написать, что ^^?)

Однако, я все еще могу получить доступ к URL:/Users/5/проектов

Я просто не вижу проекты, как ожидалось. Я бы предпочел, чтобы он сказал мне, что я не могу получить доступ к странице и перенаправить. У меня есть это в моем прикладном контроллере:

rescue_from CanCan::AccessDenied do |exception| 
    redirect_to root_url, :alert => exception.message 
end 

Но я не получаю сообщение о перенаправлении или ошибке. Нужно ли мне добавлять что-то еще к способностям, чтобы сделать эту работу?

У меня есть load_and_authorize_resource как в ProjectController, так и в UserController.

Для записи, мои маршруты выглядеть следующим образом:

resources :users do 
    resources :projects 
end 

ответ

1

Попробуйте один

if user.has_role?(:Student) 
    can :create, Project 
    can :manage, Project do |P| 
    user && P.user == user 
end 

Он проверит, владеет ли текущий пользователь проекта или нет. Если он не владеет проектом, он не сможет его изменить.

Первое условие - это просто проверить, существует или нет объект user, вы также можете использовать обработчик исключений. Вот пример того, что:

comment.try(:user) == user 
0

Если вы хотите включить переадресацию, если пользователь не может прочитать любой проект в текущей коллекции, переопределить действие указательным и добавить дополнительное исполнение:

def index 
    # @projects is loaded by the CanCan before filter load_and_authorize_resource 
    unless @projects.any?{|project| can?(:read, project)} 
    raise CanCanAccessDenied.new("no project readable there", :read, Project) 
    end 
end 

В index-like (collection), CanCan обеспечивает ACL через authorize :read, ModelClass.
https://github.com/ryanb/cancan/wiki/Checking-Abilities см. Раздел «Проверка с классом».
Как вы можете прочитать, если есть вероятность, что пользователь: прочитает любой экземпляр ModelClass (даже если эти экземпляры еще не существуют), запрос authorize :action, ModelClass разрешит.

С учетом вашего URL /users/5/projects и маршрутов resources :users do resources :projects end Я верю, что это действие является индексом для проектов для определенного пользователя. Таким образом, действие индекса CanCan будет разрешено, учитывая can :manage, Project, :user_id => user.id, поэтому могут существовать проекты, которые пользователь может: читать как таковые => разрешать. Позже я считаю, что вы разрешаете каждый конкретный экземпляр проекта can? :read, project, и там, где они фильтруются, таковая страница остается пустой.

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