Silex安全提供程序-令牌设置失败


Silex Security Provider - Token failing to be set

我是第一次与Silex的安全提供商合作,我在这个过程中遇到了问题。我目前有基本的HTTP认证工作(使用编码的示例用户,如在这里的文档中所示)。

当为表单选项切换HTTP时,登录表单正在提交,并返回到自身。我已经创建了一个UserProvider类和loadUserByUsername方法被成功调用,但是电子邮件没有被传递进来(被设置为"NONE_PROVIDED" -从用户名更改)。在处理供应商代码时,我发现这是因为没有设置令牌($app['security']->getToken()在所有点返回null)。我已经翻遍了所有能找到的文档,但我找不到任何提到这个的。

主代码包含在下面,如果有什么让我知道,谢谢!

安全提供程序配置

// Protects all routes within /auth, redirecting to /login successfully
$app->register(new SecurityServiceProvider(), array(
    'security.firewalls' => array(
        'unauth_area' => array(
            'pattern' => '^/(?!auth)'
        ),
        'auth_area' => array(
            'pattern' => '^/.*$',
            'form' => array(
                'login_path' => '/login',
                'check_path' => '/auth/login_check',
                'default_target_path' => '/auth/overview',
            ),
            'users' => $app->share(function () use ($app) {
                return new UserProvider($app['db']);
            }),
        ),
    ),
    'access_control' => array(
        array('path' => '^/.*$', 'role' => 'ROLE_USER'),
        // Include the following line to also secure the /admin path itself
        // array('path' => '^/admin$', 'role' => 'ROLE_ADMIN'),
    ),
));

(My Custom)方法- UserProvider类

public function loadUserByUsername($email) {
    // Dying at this point shows it reaches here, but $email is null
    $stmt = $this->conn->executeQuery('SELECT * FROM user WHERE email = ?', array(strtolower($email)));
    if (!$user = $stmt->fetch()) {
        throw new UsernameNotFoundException(sprintf('Email "%s" does not exist.', $email));
    }
    return new User($user['email'], $user['password'], explode(',', $user['roles']), true, true, true, true);
}

形式类

class LoginType extends AbstractType {
public function buildForm(FormBuilderInterface $builder, array $options) {
    $builder
        ->add('_username', 'text', array(
            'required' => true,
            'constraints' => array(
                new Assert'NotBlank(),
                new Assert'Email(),
            )
        ))
        ->add('_password', 'password', array(
            'required' => true,
            'constraints' => array(
                new Assert'NotBlank(),
            ),
        ))
        ->add('Login', 'submit');
}
public function getName() {
    return 'login';
}

}

Silex Security Provider docs

这与标记无关,我只是在

中遇到了同样的问题
$app->register(new Silex'Provider'SecurityServiceProvider(), array(
    'security.firewalls' => array(
        'admin' => array(
            'pattern' => '^/admin',
            'form' => array(
                'login_path' => '/', 
                'check_path' => '/admin/login_check', 
                'username_parameter'=> 'mail',
                'password_parameter' => 'password',
                 ),
                'logout' => array('logout_path' => '/logout'),
                    //'anonymous' => true,
            'users' => function () use ($app) {
                return new UserProvider($app['db']);
            },
        )
    ),
    'security.access_rules' => array(
            array('^/$', 'IS_AUTHENTICATED_ANONYMOUSLY'),
            array('^/admin', 'ROLE_USER')
        )
));

经过几个小时的尝试和测试,我检查了表单输入中的name属性…见form[mail]

所以我试了

'username_parameter'=> 'form[mail]',
'password_parameter' => 'form[password]',

还有…哈利路亚!!!!!我的邮件在loadUserByUsername($mail)