0

正如标题所说,我需要修改 sfDoctrineGuard 验证器以允许基于凭据登录。我有这个用户和凭据:

username           credential
administrator      super admin
user1              public_access
user2              
user3              public_access

我还有两个应用程序:管理员和站点。因此,基于这些数据,我需要实现这一点:

  • user1 和 user3 可以登录站点应用程序,但不能登录管理员
  • user2 无法登录网站和管理员
  • 管理员可以登录 admin 但不能登录站点

有什么帮助吗?

4

2 回答 2

1

sfGuardValidatorUser首先,您应该将类​​复制plugins/sfDoctrineGuardPlugin/lib/validatorlib/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标志。

于 2013-03-06T11:31:48.980 回答
1

您在这里混合了两件事 - 用户的身份验证和授权。

身份验证意味着您的用户可以登录网站,并且您确认这是正确的人。

授权过滤哪些内容对哪些用户可用(是否经过身份验证)。

因此,您在这里寻找的是阻止访问不应看到该admin应用程序的用户,而不是阻止登录。

如果您阻止登录部分(使用验证器、您自己的签名操作或其他),您只会阻止想要查看您的admin应用的匿名用户。当他们尝试登录时,他们将被拒绝,因为他们不是管理员。但是,如果用户登录到site应用程序然后去,admin则不需要额外的登录,并且用户将被授予访问权限(除非您设置了正确的授权)。

因此,您需要使用以下内容security.yml将文件添加到您的apps/admin/config文件夹中:

all:
  is_secure: true
  credentials: super_admin

如果“普通”用户登录并尝试导航到admin应用程序,他将被拒绝访问。

于 2013-03-06T08:40:46.660 回答