2016-11-10 2 views
0

Я использую драгоценный камень pundit и пытаюсь выяснить, как его использовать, чтобы предотвратить доступ к странице индекса, принадлежащей пользователю, отличному от current_user.Страница индексов драгоценных камней Pundit Предотвращение доступа

В примерах рассказывается только о том, как отображать результаты в current_user, но не как фактически предотвратить доступ к самой странице, если current_user НЕ является владельцем записи.

Любая помощь приветствуется

Спасибо

+0

Я думаю, что индексная страница не принадлежит ни одному пользователю. Цель состоит в том, чтобы ограничить доступ только администраторов? – moveson

+0

@moveson Это индексная страница для конкретного пользователя, там есть страница. Возможно, это не должна быть страница индекса, а отдельное действие в пользовательском контроллере, например user_posts. – Robbo

+0

Это будет иметь для меня больше смысла. Образец, описанный ниже, должен работать; просто замените 'index?' на 'user_posts?'. См. Комментарий от @Fede Bonisconti ниже для альтернативного предложения относительно того, где поставить логику 'authorized_to_edit? '. Если вы включите его где-нибудь, кроме модели User, вам нужно будет вызвать 'authorized_to_edit? (Current_user)' вместо 'current_user.authorized_to_edit?' – moveson

ответ

1

Может быть, вы хотите что-то вроде этого? (Для класса ModelName)

# /policies/model_name_policy.rb 

class ModelNamePolicy 
    attr_reader :current_user, :resource 

    def initialize(current_user, resource) 
    @current_user = current_user 
    @resource = resource 
    end 

    def index? 
    current_user.authorized_to_edit?(resource) 
    end 

end 

# /models/user.rb 

class User < ActiveRecord::Base 

    def authorized_to_edit?(resource) 
    admin? | (id == resource.created_by) # Or whatever method you want to call on your model to determine ownership 
    end 

end 

EDIT: Обратите внимание, что вы также должны вызвать authorize от контроллера для вызова политики.

+0

IMO: Идея Pundit заключается в том, чтобы не включать вашу логику авторизации в вашу модель. –

+0

Открыт для других предложений. Если 'authorized_to_edit?' Используется в политике для многих моделей, куда бы вы его поместили? – moveson

+0

'authorize_to_edit' должно быть определено в каждой политике для каждой модели. Если некоторые из ваших моделей используют одну и ту же логику авторизации, вы можете использовать класс/mixin, чтобы избежать дублирования кода. –