Spaces:
No application file
No application file
namespace Mautic\UserBundle\Security\SAML\User; | |
use LightSaml\Model\Assertion\Assertion; | |
use LightSaml\Model\Protocol\Response; | |
use LightSaml\SpBundle\Security\User\UsernameMapperInterface; | |
use Mautic\UserBundle\Entity\User; | |
class UserMapper implements UsernameMapperInterface | |
{ | |
/** | |
* @param array<string, mixed> $attributes | |
*/ | |
public function __construct( | |
private array $attributes | |
) { | |
} | |
public function getUser(Response $response): User | |
{ | |
$user = new User(); | |
foreach ($response->getAllAssertions() as $assertion) { | |
$this->setValuesFromAssertion($assertion, $user); | |
} | |
return $user; | |
} | |
public function getUsername(Response $response): ?string | |
{ | |
$user = $this->getUser($response); | |
return $user->getUserIdentifier(); | |
} | |
private function setValuesFromAssertion(Assertion $assertion, User $user): void | |
{ | |
$attributes = $this->extractAttributes($assertion); | |
// use email as the user by default | |
if (isset($attributes['email'])) { | |
$user->setEmail($attributes['email']); | |
$user->setUsername($attributes['email']); | |
} | |
if (isset($attributes['username']) && !empty($attributes['username'])) { | |
$user->setUsername($attributes['username']); | |
} | |
if (isset($attributes['firstname'])) { | |
$user->setFirstname($attributes['firstname']); | |
} | |
if (isset($attributes['lastname'])) { | |
$user->setLastName($attributes['lastname']); | |
} | |
} | |
private function extractAttributes(Assertion $assertion): array | |
{ | |
$attributes = []; | |
foreach ($this->attributes as $key => $attributeName) { | |
if (!$attributeName) { | |
continue; | |
} | |
foreach ($assertion->getAllAttributeStatements() as $attributeStatement) { | |
$attribute = $attributeStatement->getFirstAttributeByName($attributeName); | |
if ($attribute && $attribute->getFirstAttributeValue()) { | |
$attributes[$key] = $attribute->getFirstAttributeValue(); | |
} | |
} | |
} | |
return $attributes; | |
} | |
} | |