Многопользовательское приложение Rails и ограничение доступа к контроллерам - PullRequest
0 голосов
/ 18 сентября 2018

Я использую Devise для аутентификации, и в моем приложении rails есть «модули».Я пытаюсь выяснить лучший подход к безопасности.Например, вот несколько вещей, которые я хочу выполнить:

  • Я хочу, чтобы контроллер приложения требовал входа в систему, если только он не обращается к контроллеру registrations, в этом случае они просто отправляют регистрациюподробности.
  • На уровне приложения я хотел бы определить области, разрешающие доступ к определенным контроллерам, к которым имеет доступ компания пользователя.
  • Кроме того, при каждом запросе я хочу убедиться, чтолюбые идентификаторы в URL (будь то GET, POST и т. д.), компания пользователя имеет доступ к этому контроллеру и идентификатор в параметре.(Таким образом, они не могут получить доступ к идентификатору отчета 9, если с их компанией не связан идентификатор отчета 9)

Мне кажется, что это может быть масштабируемым, но я никогда не делал этого раньшетак что я не совсем уверен.

Пуля 1

В ApplicationController я хотел бы сделать что-то вроде этого:

class ApplicationController < ActionController::Base
  protect_from_forgery with: :exception
  before_action :authenticate_user! unless controller == "Registrations"
end

Я попытался поместить binding.pry вконтроллер приложения, но controller_path кажется всегда application.Не уверен, есть ли простой способ сделать это, не обращаясь к каждому отдельному контроллеру, чего я надеюсь избежать, потому что я не хочу случайно что-то забыть, когда я добавляю новый контроллер в будущем (в основном против DRY).

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

Пуля 2

Я пыталсяполучить доступ к переменной Devise current_user из контроллера приложения, но она не существует, поэтому я не уверен, смогу ли я проверить разрешения пользователя из ApplicationController.Опять же, я хотел бы избежать необходимости размещать эту проверку в каждом контроллере, потому что по мере расширения приложения я могу в конечном итоге забыть реализовать проверки.

EDIT

ИтакПохоже, у меня есть адресованный пункт 1, но теперь я пытаюсь выяснить другой 2. Способность реализовать некоторый тип «области» или модуля разрешений на уровне приложения.Есть идеи?

1 Ответ

0 голосов
/ 18 сентября 2018

Директива skip_before_action может подавить выполнение фильтра before_action, который уже определен.Вы можете использовать это, чтобы отключить действие для контроллера:

class ApplicationController < ActionController::Base
  before_action :authenticate_user!
end

class RegistrationsController < ApplicationController
  skip_before_action :authenticate_user!
end

Здесь следует отметить, что Ruby является высокодинамичным языком программирования, и код может выполняться , пока определяется класс .Важно обратить пристальное внимание на то, когда выполняются определенные операторы, поскольку такие вещи, как unless, оператор, как правило, запускаются немедленно в этом контексте.

Вы увидите некоторые другиекоторые разрешают отложенное выполнение, как в ActiveRecord с:

validates :name, unless: :anonymous?

Где у этого метода validates есть специальная опция с именем unless, которая отличается от ключевого слова unless.Это определяет триггер проверки с прикрепленным к нему условием.

С другой стороны, этот код, хотя и визуально похож, совершенно другой:

validates :name unless anonymous?

Это зависит от метода, называемого anonymous? будучи доступным на уровне класса, и если он вернет значение, отличное от nil или false, будет выполняться функция validates.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...