2012-06-19 37 views
8

我想創建自定義的用戶檢查程序來驗證針對上次接受的eula的登錄操作。 ' 想法很簡單,會有很多版本的eula和用戶不能登錄,直到他接受最新的eula。基於接受的eula的Symfony2自定義用戶檢查程序

的情況是:

  1. 用戶創建新帳號,並接受EULA。
  2. 尤拉得到更新
  3. 用戶嘗試登錄,但他沒有接受最新的EULA
  4. 用戶得到相同的登錄表單,但附加字段「接受最新最終用戶許可協議」
  5. 用戶登錄和系統信息插入:當前日期和時間,用戶ID,Eula ID跟蹤eula驗收。

我發現這一點: https://groups.google.com/forum/#!msg/symfony2/D0V0bFks9S0/Qg9mrbpfB3IJ

但可惜的是自定義的用戶檢查的不完整版本。我如何實現其餘部分?

+0

我知道這個問題是過時的security.user_checker服務被稱爲\Symfony\Component\Security\Core\Authentication\Provider\UserAuthenticationProvider::authenticate() ......但我面對的困難,我覺得有必要覆蓋用戶檢查。你找到了解決方案嗎? – Fatmuemoo

回答

0

爲什麼不將事件偵聽器附加到kernel.request事件並觀察當前登錄的用戶是否已接受最新的EULA?

爲了獲得當前用戶可以使用這樣的事情:

$securityContext = $this->container->get('security.context'); 
if (!$securityContext) { 
    return; 
} 

$user = $securityContext->getToken()->getUser(); 
+0

事件偵聽器將與檢查每個用戶操作相同。也許更靈活,但在這種情況下你仍然會被認證。我需要在**用戶被認證之前檢查這個**。 – Kaminari

+0

在這種情況下,您應該使用存儲在會話中的標記。您可以從請求中獲取會話,該請求在此事件中可用。 –

8

其實答案是很明顯的。 在您的自定義包:

config.yml

parameters: 
    security.user_checker.class: Acme\Bundle\UserBundle\Security\UserChecker 

Userchecker:

class UserChecker extends BaseUserChecker 
{ 
    /** 
    * {@inheritdoc} 
    */ 
    public function checkPreAuth(UserInterface $user) 
    { 
     //do your custom preauth stuff here 
     parent::checkPreAuth($user); 
    } 
} 
6

你可以在你的包重新定義的Symfony的用戶檢查服務(security.user_checker):

# services.yml 
security.user_checker: 
    class: MyBundle\Checker\UserChecker 
    arguments: [ "@some.service", "%some.param%" ] 

然後擴展Symfony的UserChecker:

# UserChecker.php 

use Symfony\Component\Security\Core\User\UserChecker as BaseUserChecker; 

class UserChecker extends BaseUserChecker 
{ 
    public function checkPreAuth(UserInterface $user) 
    { 
     parent::checkPreAuth($user); 

     // your stuff 
    } 

    public function checkPostAuth(UserInterface $user) 
    { 
     parent::checkPostAuth($user); 

     // your stuff 
    } 
} 

在驗證過程中

+0

在你的services.yml中請改爲:'services: security.user_checker:' –

相關問題