Wygasające hasło

Witam,

Mam następujące zadanie - muszę do aplikacji dołożyć wygasanie haseł po 90 dniach.
Z niefajnych rzeczy - aplikacja stoi na hobo - raczej tego nikt nie pochwala.

Podchodzę to tego w następujący sposób:
Dodaję w modelu pole pass_expires typu :date
Aby uniemożliwić użytkownikowi dostęp do aplikacji przed odświeżeniem hasła do application_controllera dopisuję

[code]before_filter :pass_expires, :except => [:login, :forgot_password, :reset_password, :do_reset_password]

def pass_expires
if current_user.signed_up?
redirect_to :controller=>“users”, :action=>“account”
#flash[:error] = “Debug msg”
end
end[/code]
Powyższy kod jeszcze nie ma warunku sprawdzenia, kiedy hasło wygasło, ale powinien każdego zalogowanego użytkownika przekierować na strone zgodnie z routesami:

Problem w tym, że dostaję z przeglądarki bład, że przekierowanie jest nieprawidłowe

Macie moze pomysł skąd bierze się takie zachowanie?

a

redirect_to user_account_path(current_user)

nie zadziała?

niestety - ten sam rezultat

może to kwestia środowiska?

Coś mi wygląda to na pętlę w przekierowaniach. Co pokazują logi?

w development.log nie ma żadnych informacji

masz zapętlone przekierowania (tak jak pisał bragi).

redirect_to :controller=>"users", :action=>"account"

przekieruje Cię na akcję account, jednak ustawiony wcześniej before_filter

before_filter :pass_expires, :except => [:login, :forgot_password, :reset_password, :do_reset_password]

znowu będzie przekierowywał na w/w link. I tak do usranej śmierci :wink:
Musisz dodać kolejnego excepta w tym filtrze :wink:

Faktycznie - dziękuję za pokazanie palcem.

Teraz jeśli chciałbym sprawdzić, czy haslo wygaslo musze pobrać zawartość pola pass_expires.

Niestety wywołanie go przez current_user.pass_expires rzuca ‘NoMethodError in [model]sController’ ().
Jest to o tyle dziwne, że to current_user powinien jednoznacznie wyznaczac usera.
Dopisałem w modelu Users metody

[code]
def self.get_pass_expires()
return self.pass_expires #pole
end

def pass_expires
return User.get_pass_expires()
end[/code]
ale wołanie przez nie o potrzebną wartość do niczego nie prowadzi (zmienia odrobinę opis wyjątku)
Proszę o pomoc w pobraniu tej wartości

Z góry dziękuję

W pierwszym poście pisałeś, że pole ma nazwę “pass_expired”, nie “pass_expires”. Gdzie jest literówka? :wink:

w pierwszym poście - już poprawiłem

można podejrzeć

btw; ja bym nie pisał exceptów na poziomie application_controllera tylko uzył

skip_before_filter :pass_expires, :only => [....]

w users controllerze
Plus jest taki, że ignorujesz wtedy ten hook dla akcji o podanej nazwie w KONKRETNYM kontrolerze, a nie dla wszystkich akcji o danej nazwie ;).

Hmm… dojechałem do porządanych efektów, z tym, ze w momencie, gdy zmieniam hasło jestem redirectowany do ekranu zmiany hasła zanim wszystko się zapisze.

Zgodnie z radą sevosa - przerzuciłem sprawdzanie do user_controllera, ale efekt mam taki, że

  • dla before_filter + except działa to tak samo jak w application_controlerze, z tym, że mogę chodzić w każdą zawartość inną niż user (czyli źle)
  • dla skip_before_filter + only wydaje się, że nie działa wcale…

before_filter :check_pass_expires, :except => [:login, :forgot_password, :reset_password, :do_reset_password,:account]