2013-03-05 69 views
0

正如標題所述,我需要修改sfDoctrineGuard驗證程序以允許基於證書進行登錄。我有這個用戶和憑據:如何覆蓋sfDoctrineGuard驗證程序,以便允許基於憑據登錄

username   credential 
administrator  super admin 
user1    public_access 
user2    
user3    public_access 

我也有兩個應用程序:管理員和網站。因此,基於這個數據,我需要做到這一點:

  • user1和用戶3可以在網站的應用程序登錄,但不是在管理
  • 用戶2不能在網站上登錄,無論是在管理
  • 管理員可以在登錄管理員但不在現場

任何幫助嗎?

回答

1

首先,您應該將sfGuardValidatorUser類從plugins/sfDoctrineGuardPlugin/lib/validator複製到lib/validator並清除緩存。

比修改它的doClean方法來檢查用戶是否具有所需的權限。

class sfGuardValidatorUser extends sfValidatorBase 
{ 
    // ... 

    protected function doClean($values) 
    { 
    $username = isset($values[$this->getOption('username_field')]) ? $values[$this->getOption('username_field')] : ''; 
    $password = isset($values[$this->getOption('password_field')]) ? $values[$this->getOption('password_field')] : ''; 

    $callable = sfConfig::get('app_sf_guard_plugin_retrieve_by_username_callable'); 

    if ($username && $callable) 
    { 
     $user = call_user_func_array($callable, array($username)); 
    } 
    elseif ($username) 
    { 
     $user = $this->getTable()->retrieveByUsername($username); 
    } 
    else 
    { 
     $user = false; 
    } 

    /** @var $user sfGuardUser */ 
    if ($user && $user->isAllowedToLogIn(sfConfig::get('sf_app'), $password)) 
    { 
     return array_merge($values, array('user' => $user)); 
    } 

    if ($this->getOption('throw_global_error')) 
    { 
     throw new sfValidatorError($this, 'invalid'); 
    } 

    throw new sfValidatorErrorSchema($this, array($this->getOption('username_field') => new sfValidatorError($this, 'invalid'))); 
    } 

    // ... 
} 

不是增加isAllowedToLogIn方法將sfGuardUser類:

public function isAllowedToLogIn($app, $password) 
{ 
    if ('admin' == $app) 
    { 
    $hasPermission = $this->getIsSuperAdmin() || $this->hasPermission('admin'); 
    } 
    elseif ('site' == $app) 
    { 
    $hasPermission = $this->hasPermission('public_access'); 
    } 
    else 
    { 
    $hasPermission = true; 
    } 

    return $this->getIsActive() && $this->checkPassword($password) && $hasPermission; 
} 

如果需要修改權限檢查的一部分。

我建議添加一個管理員組和權限,如果你不能使用is_super_admin標誌。

+0

我應該添加函數isAllowedToLogIn()?我的意思是在哪個文件(路線)? – ReynierPM 2013-03-06 15:12:17

+0

@ReynierPM lib/model/doctrine/sfDoctrineGuardPlugin/sfGuardUser.class.php' – 1ed 2013-03-06 16:39:52

+0

我可以以管理員身份進入管理員應用程序,而不是其他用戶,但無法使用user1憑據進入網站。我檢查權限,似乎都很好。我檢查日誌並得到這個:**檢測到CSRF攻擊。**,爲什麼? – ReynierPM 2013-03-06 17:24:07

1

您在這裏混合了兩件事 - 用戶的身份驗證和授權。

認證意味着您的用戶可以登錄到該網站,並且您確認這是合適的人。

授權過濾器哪些內容對哪些用戶可用(已驗證或未驗證)。

所以你在這裏尋找的是阻止訪問用戶誰不應該能夠看到admin應用程序,而不是阻止登錄。

如果您阻止登錄部分(使用驗證,你自己的簽名行動或其他)你只會阻止誰希望看到您的admin應用匿名用戶。當他們嘗試登錄時,他們將被拒絕,因爲他們不是管理員。但是,如果用戶登錄到site應用程序,然後轉到admin,則不需要其他登錄,並且用戶將被授予訪問權限(除非您設置了適當的授權)。

所以,你需要的是一個security.yml文件添加到您的apps/admin/config文件夾與此內容:

all: 
    is_secure: true 
    credentials: super_admin 

如果在一個「正常」的用戶登錄,並嘗試導航到admin應用程序,他將被拒絕訪問。

+0

是的,你是對的,但用戶仍然可以登錄,我不想這樣。我的意思是user1沒有訪問權限,因爲他的憑據,但仍然可以登錄,我甚至不希望這樣,我是對的? – ReynierPM 2013-03-06 15:18:23

+0

我只是沒有看到這一點。如果你真的想限制用戶登錄,你可以使用@ 1ed的答案中的代碼。只要記住,如果沒有保護上面顯示的'admin'應用程序,限制登錄將無濟於事。 – 2013-03-06 15:39:17

相關問題