[Warszawa-pm] [Catalyst] obsługa aktywacji użytkownika

Zbigniew Lukasiak zzbbyy w gmail.com
Nie, 2 Sty 2011, 01:54:42 PST


2011/1/1 Maciej Grzybek <mashester w gmail.com>:
> -----BEGIN PGP SIGNED MESSAGE-----
> Hash: SHA1
>
> Witam,
> mam pytanie, prawdopodobnie do Zbyszka (gdyż problem dotyczy Catalysta),
> ale być może kto inny też będzie miał na to pomysł. ;)
> Mianowicie, chcę stworzyć pełny panel obsługi użytkownika pod nowy
> serwis. Do tej pory stworzyłem taką reprezentację:
> SQL:
>        User:
>                id,username,password,email,inne,bzdety
>        Role:
>                id,name
>        User_Role:
>                user_id,role_id
>
> Owa reprezentacja pozwala mi w łatwy sposób przydzielać uprawnienia
> użytkownikom. Dzięki relacji many-to-many mogę nadawać różne role
> (uprawnienia) poszczególnym użytkownikom.
> Problem pojawia się, gdy chcę zabezpieczyć rejestrację użytkownika
> mechanizmem aktywacji przez link w e-mailu.
> Zastanawiałem się jak to najlepiej zrobić. Pomysł jest trywialny i
> powszechnie stosowany (problem tylko z implementacją ;P):
> dodanie dwóch (ew. jednego) pól, np. activated (bool) oraz
> activation_code (varchar) wygenerowanie jakiegoś hasha, zapisanie go do
> bazy, po czym przesłanie do usera w mailu, wraz z linkiem, pod którym
> czaiłby się mechanizm, który w sprytny sposób zmieniałby activated na
> true, pod wpływem odpowiedniego activation_code, zgodnego z tym z bazy.
> Jednak, o ile ładnie mogę sobie aktywować użytkownika, to jak sprawdzić
> przy logowaniu, czy dany user jest aktywny?
> Loguję użytkownika w taki sposób:
> $c->authenticate({ username => $username,password => $password } );
> gdzie $username i $password to odpowiednie wartości, wczytane z
> formularza logowania.
> Pierwszym pomysłem implementacji sprawdzania aktywacji było dodanie
> jeszcze jednego pola do sprawdzenia w metodzie authenticate, mianowicie:
> activated => 1.
> Jednak ten sposób nie pozwala mi na podanie użytkownikowi powodu, dla
> którego został odrzucony podczas logowania (czy podał złe hasło, czy nie
> ma aktywnego konta).
> Oczywiście można to obejść, robiąc dwa sprawdzenia (najpierw login +
> hasło, a później zapytanie o wartość activated i jeśli false to
> $c->logout), ale to chyba nie jest dobre rozwiązanie.
> Drugim pomysłem byłoby dodanie roli "activated", która nadawana byłaby
> każdego użytkownikowi, który dokonał aktywacji konta, ale wówczas w
> całym serwisie musiałbym sprawdzać $c->user_check_roles('activated'), a
> to wydaje mi się, mija się z celem.
> Jak to się robi profesjonalnie w Catalyście? Jest na to jakiś lepszy
> sposób? Póki co najrozsądniejszy wydaje mi się pierwszy (dodanie
> dodatkowego pola do sprawdzenia w metodzie authenticate), ale być może
> da się zrobić to lepiej.

Niestety już dawno się tym nie zajmowałem.   Może trzeba by po prostu
dodać jedno sprawdzenie w kontrolerze (czy co tam obsługuje formularz
login) - albo może użyć Realm (chociaż nigdy nie rozumiałem o co
chodzi z tymi Realm i czym to się różni od roli).  Pytanie jest czy
authenticate nie powinno zwracać jakiegoś kodu przyczyny albo coś.
Problem jest ciekawy (kiedyś będę się musiał zmierzyć z napisaniem
bibliotek do autentykacji w WebNano - więc jestem bardzo
zainteresowany rozwiązaniem go) i proponowałbym wysłać to na listę
Catalysta.



Pozdr.
Zbyszek


Więcej informacji o liście Warszawa-pm