Skip to content

Commit

Permalink
Fixed incompatibility of x509 auth with nginx
Browse files Browse the repository at this point in the history
  • Loading branch information
alcaeus authored and fabpot committed Apr 22, 2014
1 parent 567213f commit ba8fc16
Show file tree
Hide file tree
Showing 2 changed files with 43 additions and 21 deletions.
Expand Up @@ -41,10 +41,17 @@ public function __construct(SecurityContextInterface $securityContext, Authentic
*/
protected function getPreAuthenticatedData(Request $request)
{
if (!$request->server->has($this->userKey)) {
throw new BadCredentialsException(sprintf('SSL key was not found: %s', $this->userKey));
$user = null;
if ($request->server->has($this->userKey)) {
$user = $request->server->get($this->userKey);
} elseif ($request->server->has($this->credentialKey) && preg_match('#/emailAddress=(.+\@.+\..+)(/|$)#', $request->server->get($this->credentialKey), $matches)) {
$user = $matches[1];
}

return array($request->server->get($this->userKey), $request->server->get($this->credentialKey, ''));
if (null === $user) {
throw new BadCredentialsException(sprintf('SSL credentials not found: %s, %s', $this->userKey, $this->credentialKey));
}

return array($user, $request->server->get($this->credentialKey, ''));
}
}
Expand Up @@ -42,11 +42,7 @@ public function testGetPreAuthenticatedData($user, $credentials)

$authenticationManager = $this->getMock('Symfony\Component\Security\Core\Authentication\AuthenticationManagerInterface');

$listener = new X509AuthenticationListener(
$context,
$authenticationManager,
'TheProviderKey'
);
$listener = new X509AuthenticationListener($context, $authenticationManager, 'TheProviderKey');

$method = new \ReflectionMethod($listener, 'getPreAuthenticatedData');
$method->setAccessible(true);
Expand All @@ -63,22 +59,47 @@ public static function dataProviderGetPreAuthenticatedData()
);
}

/**
* @dataProvider dataProviderGetPreAuthenticatedDataNoUser
*/
public function testGetPreAuthenticatedDataNoUser($emailAddress)
{
$credentials = 'CN=Sample certificate DN/emailAddress='.$emailAddress;
$request = new Request(array(), array(), array(), array(), array(), array('SSL_CLIENT_S_DN' => $credentials));

$context = $this->getMock('Symfony\Component\Security\Core\SecurityContextInterface');

$authenticationManager = $this->getMock('Symfony\Component\Security\Core\Authentication\AuthenticationManagerInterface');

$listener = new X509AuthenticationListener($context, $authenticationManager, 'TheProviderKey');

$method = new \ReflectionMethod($listener, 'getPreAuthenticatedData');
$method->setAccessible(true);

$result = $method->invokeArgs($listener, array($request));
$this->assertSame($result, array($emailAddress, $credentials));
}

public static function dataProviderGetPreAuthenticatedDataNoUser()
{
return array(
'basicEmailAddress' => array('cert@example.com'),
'emailAddressWithPlusSign' => array('cert+something@example.com'),
);
}

/**
* @expectedException \Symfony\Component\Security\Core\Exception\BadCredentialsException
*/
public function testGetPreAuthenticatedDataNoUser()
public function testGetPreAuthenticatedDataNoData()
{
$request = new Request(array(), array(), array(), array(), array(), array());

$context = $this->getMock('Symfony\Component\Security\Core\SecurityContextInterface');

$authenticationManager = $this->getMock('Symfony\Component\Security\Core\Authentication\AuthenticationManagerInterface');

$listener = new X509AuthenticationListener(
$context,
$authenticationManager,
'TheProviderKey'
);
$listener = new X509AuthenticationListener($context, $authenticationManager, 'TheProviderKey');

$method = new \ReflectionMethod($listener, 'getPreAuthenticatedData');
$method->setAccessible(true);
Expand All @@ -98,13 +119,7 @@ public function testGetPreAuthenticatedDataWithDifferentKeys()

$authenticationManager = $this->getMock('Symfony\Component\Security\Core\Authentication\AuthenticationManagerInterface');

$listener = new X509AuthenticationListener(
$context,
$authenticationManager,
'TheProviderKey',
'TheUserKey',
'TheCredentialsKey'
);
$listener = new X509AuthenticationListener($context, $authenticationManager, 'TheProviderKey', 'TheUserKey', 'TheCredentialsKey');

$method = new \ReflectionMethod($listener, 'getPreAuthenticatedData');
$method->setAccessible(true);
Expand Down

0 comments on commit ba8fc16

Please sign in to comment.