2014-09-14 3 views
7

Проблема, с которой я сталкиваюсь, заключается в том, что я использую привратников resource owner credential flow для аутентификации пользователя из приложения iOS. Мой проект имеет две отдельные модели пользователей (назовем их User and Admin). Мой код выглядит так:Ресурс владельца ресурса владельца Doorkeeper для нескольких моделей

resource_owner_from_credentials do |routes| 
    user = User.find_for_database_authentication(:email => params[:username]) 
    user if user && user.valid_password?(params[:password]) 
end 

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

ответ

9

Привратник обеспечивает областях применения для этой цели (см https://github.com/doorkeeper-gem/doorkeeper/wiki/Using-Scopes)

Так что в вашем файле doorkeeper.rb вы можете сделать:

resource_owner_from_credentials do |routes| 
    if params[:scope].present? 
    case params[:scope] 
     when "user" 
     u = User.find_for_database_authentication(:email => params[:email]) 
     when "admin" 
     u = Admin.find_for_database_authentication(:email => params[:email]) 
    end 
    else 
    #default auth 
    u = User.find_for_database_authentication(:email => params[:email]) 
    end 
    u if u && u.valid_password?(params[:password]) 
end 

Тогда для проверки подлинности вашего ресурса (например, Admin.) Вы можете сделайте запрос:

POST $HOST/oauth/token 
{ 
    email: [email protected] 
    password: johndoe 
    grant_type: password 
    scope: admin 
} 
+1

СПАСИБО! Я отказался от этого давно, но сегодня мне пришлось завершить проект. Я вернулся сюда, намереваясь снова опубликовать этот вопрос и нашел ваш ответ. Это именно то, что я искал. СПАСИБО! – 2014-10-28 22:35:54

1

Вы делаете это, передавая дополнительный параметр и выбирая mo del, вы хотите аутентифицироваться на основе этого параметра. Это похоже на ответ gdonato, но возможности в привратнике лучше использовать для управления разрешениями для аутентифицированного приложения (т. Е. «Дайте этому приложению разрешение читать X и писать Y от вашего имени»).

Вот что я использую

resource_owner_from_credentials do |routes| 
    if params[:user_type].present? 
    case params[:user_type] 
    when 'user' 
     u = User.find_for_database_authentication(email: params[:email]) 
    when 'employer' 
     u = Employer.find_for_database_authentication(email: params[:email]) 
    when 'admin' 
     u = Administrator.find_for_database_authentication(email: params[:email]) 
    end 
    end # I don't want a default auth user_type, so no 'else' block for me 
    user if user && user.valid_password?(params[:password]) 
end 

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

# These are found in doorkeeper.rb, but they're commented by default. 
# You would use whatever scopes you're wanting to check 
default_scopes :public 
optional_scopes :write, :update 

Использование сферы как пары, чтобы различать между пользователем и Администратором может работать без перетасовывает default_scopes или optional_scopes в doorkeeper.rb, но только в качестве побочного эффекта обзорных, что привратник ожидает.

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