[oo] Authentication: doe ik het correct?
Onderstaand kun je m'n implementatie vinden voor authenticatie, mijn vraag is, wat denken jullie hier van? Enige verbeteringen?
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?php
$authentication = new UserAuthentication(Database::getInstance());
$authentication->setUsername($form->getUsername()->getPostedValue());
$authentication->setPassword($form->getPassword()->getPostedValue());
if ($authentication->authenticate())
{
User::login($authentication); // vervolgens op te halen met User::getUser();, returnt een nieuw user object met de id van de authenticatie.
header('Location: /');
exit;
}
else
{
$form->getUsername()->addMessage('Controleer je gebruikersnaam en/of wachtwoord.');
}
?>
$authentication = new UserAuthentication(Database::getInstance());
$authentication->setUsername($form->getUsername()->getPostedValue());
$authentication->setPassword($form->getPassword()->getPostedValue());
if ($authentication->authenticate())
{
User::login($authentication); // vervolgens op te halen met User::getUser();, returnt een nieuw user object met de id van de authenticatie.
header('Location: /');
exit;
}
else
{
$form->getUsername()->addMessage('Controleer je gebruikersnaam en/of wachtwoord.');
}
?>
Raoul
Mag ik vragen waarom je een singleton als constructor parameter meegeeft aan de UserAuthentication? Verder kan ik er niet veel over zeggen, want ik zie nergens de klasses terug :)
Vervolgens word in User::login(UserAuthentication $auth) de sessie aangemaakt in de database en wordt er dan vervolgens ook een cookie aangemaakt.
Raoul
Gewijzigd op 04/12/2012 17:41:57 door - Raoul -
wie hij zegt dat hij is.
In webapplicaties gebeurt dit vaak via een username/wachtwoord combinatie maar er zijn ook andere
opties (gebruiker opent link vanuit email en is direct ingelogd, gebruiker heeft een inlog-onthouden coockie, etc).
Deze drie manieren van inloggen (userpassword, email, coockie) moeten allemaal ondersteunt worden
door de authenticator. Hoe doen we dat?
De gegevens waarmee een gebruiker inlogt zijn dus niet altijd hetzelfde, soms wachtwoord, soms een email-token.
Daarom maken we een apparte abstrace klasse Credentials. Voor elke van de inlogwijze maken we dan een concrete klasse
UsernamePasswordCredentials, EmailTokenCredentials, RememberMeCredentials.
Dan nu de Authenticator it self. Deze bevat 1 methode autenticate(Credentials $credentials) die kan zeggen
of de gegevens geldig zijn. Indien deze gegevens geldig zijn geeft deze methode een AuthToken object terug zodat
bij een volgend page request de gebruiker niet opnieuw zijn inloggegevens nodig heeft.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
<?php
interface Credentials {
public function getCredentialsAsArray();
}
class UsernamePassword implements Credentials {}
class EmailToken implements Credentials {}
class AuthToken implements Credentials {
protected $validUntil; // DateTime
protected $createdAt; // DateTime
protected $token;
public function __construct($token, $validUntil, $createdAt = null) {
$this->token = $token;
$this->validUntil = $validUntil;
if($createdAt === null) {
$this->createdAt = new DateTime("now");
} else {
$this->createdAt = $createdAt;
}
}
public function isValid() {
// check of geldigheidstijd nog niet verstreken is
}
}
interface Authenticator {
public function authenticate(Credentials $credentials);
public function setAuthTokenMapper(Mapper $mapper);
public function checkToken(AuthToken $token);
}
class UserAuthenticator implements Authenticator {
protected $authTokenMapper;
public function setAuthTokenMapper(Mapper $mapper) {
$this->authTokenMapper = $mapper;
}
public funciton authenticate(Credentials $credentials) {
if($credentials instanceof AuthToken) {
return $this->checkToken();
}
elseif($credentials instanceof UsernamePasswordCredentials) {
// check username/password combo
// als geldig dan:
return $this->createToken();
} elseif($credentials instanceof EmailToken) {
// do other stuff
// als geldig dan:
return $this->createToken();
} else {
throw new Exception( sprintf("Unsupported credential type: %s", get_class($credentials)) );
}
}
protected function checkToken(AuthToken $token) {
if($this->authTokenMapper->find($token) === false)
{
return false;
}
else {
return $token->isValid();
}
}
protected function createToken() {
$authToken = new AuthToken("blablarandomrandom", new DateTime("tomorrow");
$this->authTokenMapper->save($authToken);
return $authToken;
}
}
[/code]
interface Credentials {
public function getCredentialsAsArray();
}
class UsernamePassword implements Credentials {}
class EmailToken implements Credentials {}
class AuthToken implements Credentials {
protected $validUntil; // DateTime
protected $createdAt; // DateTime
protected $token;
public function __construct($token, $validUntil, $createdAt = null) {
$this->token = $token;
$this->validUntil = $validUntil;
if($createdAt === null) {
$this->createdAt = new DateTime("now");
} else {
$this->createdAt = $createdAt;
}
}
public function isValid() {
// check of geldigheidstijd nog niet verstreken is
}
}
interface Authenticator {
public function authenticate(Credentials $credentials);
public function setAuthTokenMapper(Mapper $mapper);
public function checkToken(AuthToken $token);
}
class UserAuthenticator implements Authenticator {
protected $authTokenMapper;
public function setAuthTokenMapper(Mapper $mapper) {
$this->authTokenMapper = $mapper;
}
public funciton authenticate(Credentials $credentials) {
if($credentials instanceof AuthToken) {
return $this->checkToken();
}
elseif($credentials instanceof UsernamePasswordCredentials) {
// check username/password combo
// als geldig dan:
return $this->createToken();
} elseif($credentials instanceof EmailToken) {
// do other stuff
// als geldig dan:
return $this->createToken();
} else {
throw new Exception( sprintf("Unsupported credential type: %s", get_class($credentials)) );
}
}
protected function checkToken(AuthToken $token) {
if($this->authTokenMapper->find($token) === false)
{
return false;
}
else {
return $token->isValid();
}
}
protected function createToken() {
$authToken = new AuthToken("blablarandomrandom", new DateTime("tomorrow");
$this->authTokenMapper->save($authToken);
return $authToken;
}
}
[/code]
Gewijzigd op 04/12/2012 20:55:13 door Appel Taart