Używam devise i mam problem z wywołaniem zwrotnym before_filter :authenticate_admin! Użytkownika admin tworzy się poprzez dodanie atrybutu admin w tabeli users typu boolean. Identyfikacja takiego użytkownika poprzez current_user.admin?
przebiega prawidłowo, natomiast gdy dodam do kontrolera before_filter :authenticate_user!, :only => [:new, :destroy]
po zalogowaniu użytkownika z atrybutem admin o wartości T czyli administratora wykonanie tych akcji wywołuje panel logowania tak jakby użytkownik nie był adminem a zwykłym userem. Mam pytanie jeszcze czy mogę używać dwóch wywołan zwrotnych w tym kontrolerze typu:
before_filter :authenticate_user!
before_filter :authenticate_admin!
Mam kilka akcji z tego kontrolera które chciałbym udostępnić użytkownikom zwykłym jak i adminom (nie są to akcje takie same) czy to dobre rozwiązanie? Czy to będzie działać?
Nie lepiej będzie wydzielić system autoryzacji? Mniej problemów a pewnie za jakiś czas aplikacja ci się rozrośnie i i tak będziesz chciał rozbudować system.
To znaczy zastosowałem w kontrolerze helpery current_user.try(:admin) oraz current_user tak aby rozróżnić zwykłego usera od admina i to powinno wystarczyć, helper authenticate_admin! nie działa
W Devise authenticate_admin! uzywasz raczej dla modelu admin. Przynajmniej tak wynika z dokumentacji. Jezeli chcesz uzyc takiej funkcji dla Twojego przypadku to musisz sam ja napisac
Trochę ciężko mi to zrozumieć. Napisałeś “Użytkownika admin tworzy się poprzez dodanie atrybutu admin w tabeli users typu boolean”. Czyli w modelu User masz pole admin, które ustawiasz na true/false. A dalej piszesz, że stworzyłeś (jak rozumiem dodatkowo) model Admin. To trochę bez sensu Artykuł, na który się powołujesz podaje dwa sposoby tworzenia roli admin i wychodzi mi na to, że użyłeś ich obu.
Załóżmy jednak, że masz sytuację z dodanym polem admin (typu boolean) do modelu User (czyli tak jak napisałeś w pierwszym poście). Żeby uwierzytelnić użytkownika stosujesz wtedy:
Jeżeli Twój model nazywałby się Human to musiałbyś zastosować before_filter :authenticate_human!
Metoda ta sprawdza, czy dany użytkownik (User), który chce wykonać akcję New jest zalogowany w systemie i jeżeli nie to wysyła go strony logowania. Jeżeli jest zalogowany to wykona tę akcję. Teraz załóżmy, że chcesz żeby akcja “new” była wykonywana tylko przez administratora (czyli użytkownika User z polem admin ustawionym na true):
def new
if current_user.admin?
@my_object = MyObject.new
else
redirect_to root_path
end
end
Jeżeli jesteś zalogowany na użytkownika, który ma ustawione pole admin na true to akcja New zostanie wywołana. Jeżeli nie jesteś zalogowany (zalogowanie z wykorzystaniem modelu Admin się nie liczy w tym przypadku!) albo użytkownik, na którego koncie jesteś zalogowany nie jest administratorem (pole admin ustawione jest na false albo wręcz ma nil) to przekieruje Cię na główną stronę. I właściwie to by było na tyle.