2014-06-15 65 views
1

我正在與Silex的安全提供商第一次合作,並且我遇到了這個過程中的問題。我目前有基本的HTTP驗證工作(使用編碼示例用戶,如here in the docs所示)。Silex安全提供商 - 令牌未能設置

當爲表單選項切換HTTP時,登錄表單正在提交併返回自己。我創建了UserProvider類,並且loadUserByUsername方法正在成功調用,但是電子郵件未被傳入(被設置爲"NONE_PROVIDED" - 從用戶名更改)。我在通過供應商代碼工作時發現這是因爲未設置令牌($app['security']->getToken()在所有點都返回空值)。我瀏覽了所有可以找到的文檔,但我找不到任何提及的內容。

主要代碼包含在下面,讓我知道如果還有其他東西,謝謝!

安全提供配置

// 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'), 
    ), 
)); 

(我的自定義)方法 - 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); 
} 

Form類

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

+0

你也可以發佈你的表單嗎?用戶名元素仍然被稱爲「_username」? –

+0

此外,爲了確保,請檢查以下內容:「如果您使用表單來驗證用戶,則需要啓用SessionServiceProvider.' –

+0

我已經包含表單,我嘗試將其還原爲」_username「讓它工作(我達到了漫無目的的修補階段,所以我嘗試了各種各樣)。包含依賴關係(作曲家)並且安全提供程序已註冊,如果這就是您的意思? –

回答

2

它無關令牌...我只是有同樣的問題與

$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]', 

And ... ALLELUIA !!!!!有我的郵件在loadUserByUsername($mail)