CAS SSO с обработчиком аутентификации Silex guard

Я реализовал аутентификацию jasig / phpCas в приложении My Silex.
Это почти сделано, но я не могу обработать ответную реакцию authfailure.

$app['app.token_authenticator'] = function ($app) {
return new MyApp\Domain\MyTokenAuthenticator($app['security.encoder_factory'],$app['cas'],$app['dao.usersso']);
};

$app['security.firewalls'] = array(
'default' => array(
'pattern' => '^/.*$',
'anonymous' => true,

'guard' => array(
'authenticators' => array(
'app.token_authenticator'
),
),
'logout' => array ( 'logout_path' => '/logout', 'target_url' => '/goodbye' ),
'form' => array('login_path' =>'/login', 'check_path' =>'/admin/login_check', 'authenticator' => 'time_authenticator' ),
'users' => function () use ($app) {
return new MyApp\DAO\UserDAO($app['db']);
},
),
);

Класс MyTokenAuthenticator:

class MyTokenAuthenticator extends AbstractGuardAuthenticator
{
private $encoderFactory;
private $cas_settings;
private $sso_dao;

public function __construct(EncoderFactoryInterface $encoderFactory, $cas_settings, MyApp\DAO\UserSsoDAO $userdao)
{
$this->encoderFactory = $encoderFactory;
$this->cas_settings = $cas_settings;
$this->sso_dao = $userdao;
}

public function getCredentials(Request $request)
{
$bSSO = false;

//Test request for sso
if ( strpos($request->get("ticket"),"cas-intra") !==false )
$bSSO = true;
if($request->get("sso") == "1")
$bSSO=true;

if ($bSSO)
{
if ($this->cas_settings['debug'])
{
\CAS_phpCAS::setDebug();
\CAS_phpCAS::setVerbose(true);
}

\CAS_phpCAS::client(CAS_VERSION_2_0,
$this->cas_settings['server'],
$this->cas_settings['port'],
$this->cas_settings['context'],
false);

\CAS_phpCAS::setCasServerCACert('../app/config/cas.pem');
// force CAS authentication
\CAS_phpCAS::forceAuthentication();
$username = \CAS_phpCAS::getUser();
return array (
'username' => $username,
'secret' => 'SSO'
);
}

//Nothing to do, skip custom auth
return;
}

/**
* Get User from the SSO database.
* Add it into the MyApp users database (Update if already exists)
* {@inheritDoc}
* @see \Symfony\Component\Security\Guard\GuardAuthenticatorInterface::getUser()
*/
public function getUser($credentials, UserProviderInterface $userProvider)
{
//Get user stuf
....
//return $userProvider->loadUserByUsername($credentials['username']);
return $user;
}

/**
*
* {@inheritDoc}
* @see \Symfony\Component\Security\Guard\GuardAuthenticatorInterface::checkCredentials()
*/
public function checkCredentials($credentials, UserInterface $user)
{
// check credentials - e.g. make sure the password is valid
// return true to cause authentication success

if ( $this->sso_dao->isBAllowed($user->getLogin() ) )
return true;
else
throw new CustomUserMessageAuthenticationException("Sorry, you're not alllowed tu use this app.");
}

public function onAuthenticationSuccess(Request $request, TokenInterface $token, $providerKey)
{
// on success, let the request continue
return;
}

public function onAuthenticationFailure(Request $request, AuthenticationException $exception)
{
$data = array(
'message' => strtr($exception->getMessageKey(), $exception->getMessageData()),

// or to translate this message
// $this->translator->trans($exception->getMessageKey(), $exception->getMessageData())
);

return new JsonResponse($data,403);

}

Проблема в том, что в приложении отказано в действительном пользователе из единого входа. Отображает
страница с сообщением json, без какой-либо визуализации.
Мой обходной путь — использовать минимальную HTML-страницу со ссылкой выхода из sso в качестве ответа и session_destroy(), но это быстро и грязно исправить.

Я бы хотел, чтобы с помощью ветки было снято новое сообщение с хорошим сообщением об ошибке. Может быть, какой-то другой класс для расширения? Документация Silex не помогла. Спасибо !

0

Решение

Вернемся к этому вопросу, поскольку я был на других аптеках dev.
Решение @mTorres работает. Мне пришлось хранить весь объект приложения через конструктор, так как ветка не установлена ​​в данный момент в реестре сервисов.

class MyTokenAuthenticator extends AbstractGuardAuthenticator
{
private $app;

public function __construct($app)
{
$this->app=$app;
}

тогда пользовательское событие

public function onAuthenticationFailure(Request $request, AuthenticationException $exception)
{
return new \Symfony\Component\HttpFoundation\Response(
$this->app['twig']->render( 'logout.html.twig',array(
'error'         => $data,
));
}

Большое спасибо !

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]