added support for saml login (#1408)
This commit is contained in:
@@ -66,6 +66,7 @@ class Configuration implements ConfigurationInterface
|
||||
->append($this->getDefaultsNode())
|
||||
->append($this->getPermissionsNode())
|
||||
->append($this->getLdapNode())
|
||||
->append($this->getSamlNode())
|
||||
->end()
|
||||
->end();
|
||||
|
||||
@@ -666,4 +667,194 @@ class Configuration implements ConfigurationInterface
|
||||
|
||||
return $node;
|
||||
}
|
||||
|
||||
protected function getSamlNode()
|
||||
{
|
||||
$builder = new TreeBuilder('saml');
|
||||
/** @var ArrayNodeDefinition $node */
|
||||
$node = $builder->getRootNode();
|
||||
|
||||
$node
|
||||
->addDefaultsIfNotSet()
|
||||
->children()
|
||||
->booleanNode('activate')
|
||||
->defaultFalse()
|
||||
->end()
|
||||
->scalarNode('title')
|
||||
->defaultValue('Login with SAML')
|
||||
->end()
|
||||
->arrayNode('roles')
|
||||
->addDefaultsIfNotSet()
|
||||
->children()
|
||||
->scalarNode('attribute')
|
||||
->defaultNull()
|
||||
->end()
|
||||
->arrayNode('mapping')
|
||||
->defaultValue([])
|
||||
->arrayPrototype()
|
||||
->children()
|
||||
->scalarNode('saml')->isRequired()->cannotBeEmpty()->end()
|
||||
->scalarNode('kimai')->isRequired()->cannotBeEmpty()->end()
|
||||
->end()
|
||||
->end()
|
||||
->end()
|
||||
->end()
|
||||
->end()
|
||||
->arrayNode('mapping')
|
||||
->defaultValue([])
|
||||
->arrayPrototype()
|
||||
->children()
|
||||
->scalarNode('saml')->isRequired()->cannotBeEmpty()->end()
|
||||
->scalarNode('kimai')->isRequired()->cannotBeEmpty()->end()
|
||||
->end()
|
||||
->end()
|
||||
->end()
|
||||
->arrayNode('connection')
|
||||
->addDefaultsIfNotSet()
|
||||
->children()
|
||||
->scalarNode('baseurl')->end()
|
||||
->booleanNode('strict')->end()
|
||||
->booleanNode('debug')->end()
|
||||
->arrayNode('idp')
|
||||
->children()
|
||||
->scalarNode('entityId')->end()
|
||||
->scalarNode('x509cert')->end()
|
||||
->arrayNode('singleSignOnService')
|
||||
->children()
|
||||
->scalarNode('url')->end()
|
||||
->scalarNode('binding')->end()
|
||||
->end()
|
||||
->end()
|
||||
->arrayNode('singleLogoutService')
|
||||
->children()
|
||||
->scalarNode('url')->end()
|
||||
->scalarNode('binding')->end()
|
||||
->end()
|
||||
->end()
|
||||
->scalarNode('certFingerprint')->end()
|
||||
->scalarNode('certFingerprintAlgorithm')->end()
|
||||
->arrayNode('x509certMulti')
|
||||
->children()
|
||||
->arrayNode('signing')
|
||||
->prototype('scalar')->end()
|
||||
->end()
|
||||
->arrayNode('encryption')
|
||||
->prototype('scalar')->end()
|
||||
->end()
|
||||
->end()
|
||||
->end()
|
||||
->end()
|
||||
->end()
|
||||
->arrayNode('sp')
|
||||
->children()
|
||||
->scalarNode('entityId')->end()
|
||||
->scalarNode('NameIDFormat')->end()
|
||||
->scalarNode('x509cert')->end()
|
||||
->scalarNode('privateKey')->end()
|
||||
->arrayNode('assertionConsumerService')
|
||||
->children()
|
||||
->scalarNode('url')->end()
|
||||
->scalarNode('binding')->end()
|
||||
->end()
|
||||
->end()
|
||||
->arrayNode('attributeConsumingService')
|
||||
->children()
|
||||
->scalarNode('serviceName')->end()
|
||||
->scalarNode('serviceDescription')->end()
|
||||
->arrayNode('requestedAttributes')
|
||||
->prototype('array')
|
||||
->children()
|
||||
->scalarNode('name')->end()
|
||||
->booleanNode('isRequired')->defaultValue(false)->end()
|
||||
->scalarNode('nameFormat')->end()
|
||||
->scalarNode('friendlyName')->end()
|
||||
->arrayNode('attributeValue')->end()
|
||||
->end()
|
||||
->end()
|
||||
->end()
|
||||
->end()
|
||||
->end()
|
||||
->arrayNode('singleLogoutService')
|
||||
->children()
|
||||
->scalarNode('url')->end()
|
||||
->scalarNode('binding')->end()
|
||||
->end()
|
||||
->end()
|
||||
->end()
|
||||
->end()
|
||||
->arrayNode('security')
|
||||
->children()
|
||||
->booleanNode('nameIdEncrypted')->end()
|
||||
->booleanNode('authnRequestsSigned')->end()
|
||||
->booleanNode('logoutRequestSigned')->end()
|
||||
->booleanNode('logoutResponseSigned')->end()
|
||||
->booleanNode('wantMessagesSigned')->end()
|
||||
->booleanNode('wantAssertionsSigned')->end()
|
||||
->booleanNode('wantAssertionsEncrypted')->end()
|
||||
->booleanNode('wantNameId')->end()
|
||||
->booleanNode('wantNameIdEncrypted')->end()
|
||||
->variableNode('requestedAuthnContext')
|
||||
->validate()
|
||||
->ifTrue(function ($v) {
|
||||
return !is_bool($v) && !is_array($v);
|
||||
})
|
||||
->thenInvalid('Must be an array or a bool.')
|
||||
->end()
|
||||
->end()
|
||||
->booleanNode('signMetadata')->end()
|
||||
->booleanNode('wantXMLValidation')->end()
|
||||
->booleanNode('lowercaseUrlencoding')->end()
|
||||
->scalarNode('signatureAlgorithm')->end()
|
||||
->scalarNode('digestAlgorithm')->end()
|
||||
->scalarNode('entityManagerName')->end()
|
||||
->end()
|
||||
->end()
|
||||
->arrayNode('contactPerson')
|
||||
->children()
|
||||
->arrayNode('technical')
|
||||
->children()
|
||||
->scalarNode('givenName')->end()
|
||||
->scalarNode('emailAddress')->end()
|
||||
->end()
|
||||
->end()
|
||||
->arrayNode('support')
|
||||
->children()
|
||||
->scalarNode('givenName')->end()
|
||||
->scalarNode('emailAddress')->end()
|
||||
->end()
|
||||
->end()
|
||||
->end()
|
||||
->end()
|
||||
->arrayNode('organization')
|
||||
->prototype('array')
|
||||
->children()
|
||||
->scalarNode('name')->end()
|
||||
->scalarNode('displayname')->end()
|
||||
->scalarNode('url')->end()
|
||||
->end()
|
||||
->end()
|
||||
->end()
|
||||
->end()
|
||||
->end()
|
||||
->end()
|
||||
->validate()
|
||||
->ifTrue(static function ($v) {
|
||||
if (true !== $v['activate']) {
|
||||
return false;
|
||||
}
|
||||
$found = false;
|
||||
foreach ($v['mapping'] as $mapping) {
|
||||
if ($mapping['kimai'] === 'email') {
|
||||
$found = true;
|
||||
}
|
||||
}
|
||||
|
||||
return !$found;
|
||||
})
|
||||
->thenInvalid('You need to configure a SAML mapping for the email attribute.')
|
||||
->end()
|
||||
;
|
||||
|
||||
return $node;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user