2014-09-14 10 views
7

Problem polega na tym, że używam odźwiernych resource owner credential flow do uwierzytelniania użytkownika z aplikacji na iOS. Mój projekt ma jednak dwa osobne modele użytkowników (nazwijmy je User i Admin). Mój kod wygląda następująco:Przepływ poświadczeń właściciela zasobu doorkera dla wielu modeli

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

Działa, ale jak mogę sprawdzić również dla administratora? Innymi słowy, nie wiem, czy osoba logująca się jest użytkownikiem czy administratorem - w jaki sposób mogę sprawdzić oba?

Odpowiedz

9

odźwierny zapewnia zakresów do tego celu (patrz https://github.com/doorkeeper-gem/doorkeeper/wiki/Using-Scopes)

to w pliku doorkeeper.rb można zrobić:

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 

wtedy dla uwierzytelniania zasobu (ex Admin.) Można złożyć taki wniosek:

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

DZIĘKUJEMY! Zrezygnowałem z tego dawno temu, ale dzisiaj musiałem ukończyć projekt. Wróciłem tutaj, chcąc ponownie opublikować to pytanie i znalazłem odpowiedź. Właśnie tego szukałem. DZIĘKUJĘ CI! –

1

Robisz to, przekazując dodatkowy parametr i wybierając opcję del, które chcesz uwierzytelnić na podstawie tego parametru. Jest to podobne do odpowiedzi gdonato, ale zakresy w odźwiernym są lepiej wykorzystywane do zarządzania uprawnieniami nadawanymi uwierzytelnionej aplikacji (np. "Daj tej aplikacji uprawnienia do czytania X i pisania w twoim imieniu").

Oto co używam

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 

Zauważ, że jeśli były to zrobić przy użyciu zakresów zamiast param że odźwierny nie jest już używana do czegoś innego, będziesz musiał skonfigurować zakresy jak:

# 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 

Korzystanie zakres jako param do rozróżnienia pomiędzy użytkownikiem a administrator może działać bez jiggering default_scopes lub optional_scopes w doorkeeper.rb, ale tylko jako efekt uboczny w scopingu że odźwierny spodziewa.

Powiązane problemy