首先,您應該將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
標誌。
來源
2013-03-06 11:31:48
1ed
我應該添加函數isAllowedToLogIn()?我的意思是在哪個文件(路線)? – ReynierPM 2013-03-06 15:12:17
@ReynierPM lib/model/doctrine/sfDoctrineGuardPlugin/sfGuardUser.class.php' – 1ed 2013-03-06 16:39:52
我可以以管理員身份進入管理員應用程序,而不是其他用戶,但無法使用user1憑據進入網站。我檢查權限,似乎都很好。我檢查日誌並得到這個:**檢測到CSRF攻擊。**,爲什麼? – ReynierPM 2013-03-06 17:24:07