2015-02-03 2 views
0

Мне нужна помощь с авторизацией. До сих пор я пытался решить эту проблему с помощью внутренней рельсовой авторизации в сочетании с разработкой. У меня есть пользователь, который отправляет запрос. Если этот запрос является приватным, только группа «читателей» может видеть и отвечать на запрос. (Это номер один)Авторизация с помощью Devise и нескольких уровней

Затем пользователь дает оценку ответа читателя. Это должно быть доступно только для пользователя, который получил ответ и «читателя», который дал ответ.

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

before_filter :require_reader!, only: [:open_requests] 

Но если запрос не скрыт, чем до сих пор только читатель должен быть в состоянии ответить на запрос (но может все видеть это). Здесь я не знаю, как это сделать. Есть идеи?

Чтобы продолжить ... Мне не удалось решить вторую проблему (что рейтинг рассматривается только тем, кто размещал запрос и читателя). Любые идеи здесь?

Возможно ли cancancan вариант?

Лучшие witali

+0

Что вы используете для определения группы «читателей»? Devise используется для аутентификации пользователя, чтобы вы знали, кто он, но некоторые из вашей собственной логики или другой библиотеки должны использоваться для управления членством в группе и разрешениями. – LisaD

+0

Cancancan или xacml - это путь –

+0

@LisaD: Я использую генератор www.railsbricks.net (действительно круто!), И он поставляется с функцией администратора. Я применил это к «читателю». Однако возникает вопрос, как ограничить функциональность (сообщение и представление). Каждый может это увидеть, но только «читатель» может отправить ответ. DavidBrossard: Спасибо, я проверю xacml. – ertix4248

ответ

0

Что вы делаете не совсем по той же схеме «администратора», который обычно установка с помощью инструментов Railsbricks. Шаблон разрешений «admin» обычно представляет собой целый набор действий/представлений, доступных только для администраторов, поэтому часто весь контроллер или семейство контроллеров имеют: require_admin! фильтр применяется перед каждым действием и видом. Очень простая логика разрешений, и это зависит только от пользователя и вида.

Вместо этого у вас есть виды с разрешениями, которые зависят от состояния вашего объекта, а также от статуса пользователя и вида. Поэтому вам придется писать собственный фильтр для использования вместо «require_reader!».

Например, вы могли бы иметь RequestsController, и вы могли бы добавить к этому:

before_action :must_be_able_to_view_request, except: [:index, :new, :create] 

Затем определите, что фильтр в контроллере:

private 
    def must_be_able_to_view_request 
    if !current_user.is_reader? && [email protected] 
     head :forbidden 
    end 
    end 

Если вам нужно использовать один и тот же фильтр в других контроллерах, вы можете определить его в своем ApplicationController.

+0

Вы правы со всем контроллером. Это хороший момент. Я попробую ваш вариант фильтра и дам вам знать, когда у меня появятся некоторые результаты. Большое вам спасибо за вашу помощь! – ertix4248

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