2013-03-05 71 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

相关问题