Les objets Identité sont renvoyés par le service d’authentification et rendus
disponibles dans la requête. Les identités fournissent une méthode
getIdentifier()
qui peut être appelée pour obtenir dans l’identité la valeur
de l’identifiant primaire de la connexion en cours.
La raison pour laquelle cet objet existe est le besoin de fournir une interface qui réalise ces implémentations/sources:
// Service
$authenticationService
->getIdentity()
->getIdentifier()
// Component
$this->Authentication
->getIdentity()
->getIdentifier();
// Request
$this->request
->getAttribute('identity')
->getIdentifier();
L’objet identité fournit ArrayAccess mais aussi une méthode get()
pour
accéder aux données. Il est fortement recommandé d’utiliser la méthode get()
plutôt qu’un accès à la façon des tableaux parce que la méthode get()
a
connaissance du mappage des champs:
$identity->get('email');
$identity->get('username');
La méthode get()
peut aussi être typée explicitement via un
méta-fichier EDI, par exemple avec
IdeHelper.
Si vous voulez, vous pouvez malgré tout utiliser l’accès par propriétés:
$identity->email;
$identity->username;
La classe par défaut de l’objet identité peut être configurée pour mapper des
champs. C’est particulièrement utile si l’identifiant de l’identité n’est pas un
champ conventionnel id
ou si vous voulez mapper des champs avec des noms
plus généraux ou plus communs:
$identity = new Identity($data, [
'fieldMap' => [
'id' => 'uid',
'username' => 'prenom'
]
]);
Par défaut le plugin Authentication va envelopper les données utilisateur
renvoyées dans un IdentityDecorator
qui mandate (proxy) l’accès aux
méthodes et aux propriétés. Si vous voulez créer votre propre objet identité,
votre objet doit implémenter IdentityInterface
.
Si vous voulez continuer à utiliser votre classe User existante avec ce plugin,
vous pouvez implémenter l’interface Authentication\IdentityInterface
:
namespace App\Model\Entity;
use Authentication\IdentityInterface;
use Cake\ORM\Entity;
class User extends Entity implements IdentityInterface
{
/**
* Authentication\IdentityInterface method
*/
public function getIdentifier()
{
return $this->id;
}
/**
* Authentication\IdentityInterface method
*/
public function getOriginalData()
{
return $this;
}
// Autres méthodes
}
Si les objets résultant de vos identificateurs ne peuvent pas être modifiés pour
implémenter l’interface IdentityInterface
, vous pouvez implémenter un
décorateur personnalisé qui l’implémente lui-même:
// Vous pouvez utiliser un callable...
$identityResolver = function ($data) {
return new MyCustomIdentity($data);
};
//...ou un nom de classe pour définir le wrapper d'identité.
$identityResolver = MyCustomIdentity::class;
// Ensuite passez-le dans la configuration du service
$service = new AuthenticationService([
'identityClass' => $identityResolver,
'identifiers' => [
'Authentication.Password'
],
'authenticators' => [
'Authentication.Form'
]
]);