2013-12-18 1 views
1

я следующие таблицы:Devise: Как только аутентифицировать пользователей, у которых есть отношение к другой модели?

users 
====== 
id 
email 
password 
..device columns.. 

providers 
========== 
user_id 
..irreverent columns.. 

consumers 
========== 
user_id 
..irrelevant columns.. 

как потребителей, так и поставщиков принадлежат к users таблице, мы используем эту конструкцию, потому что есть области веб-приложение, которое обе стороны могут получить доступ, однако, иногда являются областями, зависящими от провайдера, потребителями которых не должно быть, например, панель управления поставщиками.

Таким образом, возникает вопрос: Как получить Devise, чтобы просто аутентифицировать поставщиков, а не потребителей на конкретных пространствах поставщиков, когда он знает только о таблице пользователей, а не о поставщиках/потребителях?

Вот что я думаю я должен делать:

контроллеры/поставщик/base_controller.rb:

before_action :authenticate_provider! 

    private 
    #A modified wrapper around authenticate_user! 
    def authenticate_provider! 
    authenticate_user! 
    redirect_to sign_in_path unless Provider.find_by(user: current_user) 
    end 
+0

Остерегайтесь этих непочтительных колонок – Slicedpan

+1

На более серьезной ноте, что не так с решением, которое вы предложили? – Slicedpan

+0

@Slicedpan На самом деле ничего, я просто ожидал более элегантного решения, возможно, функции, исходящей из Devise из коробки. – Abdulaziz

ответ

1

Несколько вещей, которые вы могли бы хотеть рассмотреть:

  1. Вместо использования отдельных таблиц для поставщиков и потребителей вы можете создать атрибут роли для таблицы users. Этот дизайн, похоже, больше подходит для ваших нужд.

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

#

def new 
    redirect_to root_path, alert: "Unauthorized access." if current_user.role == "consumer" 
end 

Позвольте мне знать, если это помогает.

+1

Собирался опубликовать это - то, что вам нужно, это авторизация, а не аутентификация. Просто выполните проверку подлинности пользователя, игнорируя их роль, а затем проверьте роль current_user в файле before_filter на действия контроллера, которые вы хотите ограничить. – gregates

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