正如标题所说,我需要修改 sfDoctrineGuard 验证器以允许基于凭据登录。我有这个用户和凭据:
username credential
administrator super admin
user1 public_access
user2
user3 public_access
我还有两个应用程序:管理和站点。因此,根据这些数据,我需要实现这一目标:
有什么帮助吗?
首先,您应该将
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
标志。
您在这里混合了两件事 - 用户身份验证和授权。
身份验证意味着您的用户可以登录网站,并且您可以确认这是正确的人。
授权过滤哪些内容可供哪些用户使用(经过身份验证或未经身份验证)。
因此,您在这里要寻找的是阻止那些不应该看到
admin
应用程序的用户的访问,而不是阻止登录。
如果您阻止登录部分(使用验证器、您自己的签名操作或其他方式),您只会阻止想要查看您的
admin
应用程序的匿名用户。当他们尝试登录时,他们将被拒绝,因为他们不是管理员。但是,如果用户登录到 site
应用程序,然后转到 admin
,则无需额外登录,并且用户将被授予访问权限(除非您设置了正确的授权)。
因此,您需要将
security.yml
文件添加到您的 apps/admin/config
文件夹,其中包含以下内容:
all:
is_secure: true
credentials: super_admin
如果“普通”用户登录并尝试导航到
admin
应用程序,他将被拒绝访问。