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

Maciej Grzybek mashester w gmail.com
Sob, 1 Sty 2011, 11:31:55 PST


-----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.

Za wszelkie sugestie z góry dziękuję i pozdrawiam,
Maciek Grzybek
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v2.0.16 (GNU/Linux)
Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org/

iQIcBAEBAgAGBQJNH4ErAAoJEJsau/Tq/KXRBecQAL+oTQMXWoFHSCdqcliEiuKj
jsbSMEK2TPVuG2CBug6gN7FMhHIKtYFBA5DibctTpFb6U2imA4FilufdMsiBjqid
IFMWwHCBbVOXJMatPROXX1E7HcW26XH6tfpsniaBQANgdqCCmmryhyaLjTZUI1pN
IYoCNZmPDud3DO+59jOqcK0ae6AQNY+71yTulBVt06uHf4dKLzI/bo4L459B5os1
q6K3VyPNlKmRQ/IXKSZFcZoNGN3jZBrRrz21wWnTTlYm0M9LT0FTJ+dh1vHjHRDW
+y90vv3botb7Ktte4zx8nuSBIWmpju+o4x6n+fIdiiTZkp+VVIErki1essb9KQDx
iwcG8LHn3GkAh9k0iR3dHsvhoeExzLLHI1YGtRpat3rm4i4Z3B/N1ZeRAi6b7AQM
w8If1Aky+x2OD5ScFUKQ8qY6CEu5VUWtvG6dIf/+CVqa+PQwIQd1TMrL7l2JUhs7
jfBFUmUS6xgdVub1rpWFK2Zq8nHWhSmzGuPlu9Ve1JGoc9T1gdfL1eAwTgzxsheC
iJh9XWJoupMmEw1Ex9rOg/M5Kqt8mQo7ZuP0f3bhAlKSiYE+7mPXjMVOC986BuHW
eF7sYJBZtCfYhFWtaeMnCqYaTZO51dPYfgM46x96LYgBLo0huq9HEKrBMie+WHLD
2TxH8LTOoXx5z8//q9OF
=7nfz
-----END PGP SIGNATURE-----


Więcej informacji o liście Warszawa-pm