Silex 2:删除默认身份验证提供程序UserAuthenticationProvider

时间:2017-06-30 07:29:11

标签: php authentication silex

有没有办法从UserAuthenticationProvider删除默认身份验证提供程序$app['security.authentication_manager']

我创建了自己的身份验证提供程序,并且我不想使用默认的一个调用DaoAuthenticationProvider来检查用户密码,因为身份验证过程不起作用。

此时,身份验证管理器调用2个身份验证提供程序:我的自定义和默认提供程序。为了允许成功的身份验证,我覆盖DAO以跳过测试,但它不干净。

自定义身份验证提供程序

$app['security.authentication_listener.factory.sds'] = $app->protect(function ($name, $options) use ($app) {
    // define the authentication provider object
    $app['security.authentication_provider.'.$name.'.sds'] = function () use ($app) {
        return new CustomAuthenticationProvider($app['user.provider'], $app['security.encoder_factory']);
    };

    // define the authentication listener object
    $app['security.authentication_listener.'.$name.'.sds'] = function () use ($app) {
        return new CustomAuthenticationListener($app['security.token_storage'], $app['security.authentication_manager']);
    };

    return array(
        // the authentication provider id
        'security.authentication_provider.'.$name.'.sds',
        // the authentication listener id
        'security.authentication_listener.'.$name.'.sds',
        // the entry point id
        null,
        // the position of the listener in the stack
        'pre_auth'
    );
});

覆盖DAO以使用自定义calss并跳过测试。 我想通过从身份验证管理器中删除DAO调用来避免这一点。

$app['security.authentication_provider.dao._proto'] = $app->protect(function ($name) use($app) {
        return new \Trilogis\Classes\CustomUserAuthenticationProvider(
            $app['security.user_provider.' . $name],
            $app['security.user_checker'],
            $name,
            $app['security.encoder_factory']
        );
    });

1 个答案:

答案 0 :(得分:0)

只是一个快速猜测,但你可以尝试覆盖$app['security.authentication_providers']数组,以便只启用你的。

<?php
//...
// overriding available providers to only allow mine
$app['security.authentication_providers'] = [
   $app['security.authentication_listener.factory.sds']
];

通过覆盖它,你是configuring the Authentication Manager with only one provider

恕我直言,这比覆盖DaoAuthenticationProvider更清洁