Devise before_filter

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.

Ja od siebie polecę CanCan.

Szczerze powiem przewiduję że aplikacja się nie rozrośnie to ma być mała aplikacja dlatego nie chcę systemu autoryzacji.

mógł byś tu wkleić te akcje, no i daj w user cos na styl

return true if user || admin

a w admin tylko admin,
powinno działać

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

Jak mówię wklej cały kod, coś wtedy będzie można więcej powiedzieć, bo działać musi.

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 :slight_smile:

Tak mam model Admin, zrobiłem wszystko według tego tutoriala: https://github.com/plataformatec/devise/wiki/How-To:-Add-an-Admin-role

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 :slight_smile: 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:

before_filter :authenticate_user!, :only => ["new"]

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.

Tak, dzięki za odpowiedź. Zastosowałem już rozwiązanie które ma pole admin w modelu User, w kontrolerach użyłem helpera if current_user.admin?

zależy od typu tego pola jak jest boolean to tak.