0

タイトルにあるように、資格情報に基づいてログインできるようにsfDoctrineGuardバリデーターを変更する必要があります。私はこのユーザーと資格情報を持っています:

username           credential
administrator      super admin
user1              public_access
user2              
user3              public_access

また、管理者とサイトの2つのアプリケーションがあります。したがって、このデータに基づいて、これを達成する必要があります。

  • user1とuser3はサイトアプリにログインできますが、管理者にはログインできません
  • user2はサイトと管理者のどちらにもログインできませんでした
  • 管理者はadminにログインできますが、サイトにはログインできません

何か助けはありますか?

4

2 に答える 2

1

ここでは、ユーザーの認証と承認という2つのことを組み合わせています。

認証とは、ユーザーがWebサイトにログインできることを意味し、これが適切な人物であることを確認できます。

承認は、どのコンテンツをどのユーザーが利用できるか(認証されているかどうかに関係なく)をフィルタリングします。

adminしたがって、ここで探しているのは、ログインをブロックするのではなく、アプリを表示できないはずのユーザーへのアクセスをブロックすることです。

ログイン部分をブロックすると(バリデーター、独自の署名アクションなどを使用して)、アプリを表示したい匿名ユーザーのみがブロックされますadmin。彼らがログインしようとすると、彼らは管理者ではないため拒否されます。ただし、ユーザーがsiteアプリにログインしてからadminそこにアクセスした場合、追加のログインは不要であり、ユーザーにはアクセスが許可されます(適切な承認を設定しない限り)。

したがって、必要なのは、このコンテンツを含むsecurity.ymlファイルをフォルダーに追加することです。apps/admin/config

all:
  is_secure: true
  credentials: super_admin

「通常の」ユーザーがログインしてアプリに移動しようとすると、adminアクセスが拒否されます。

于 2013-03-06T08:40:46.660 に答える
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管理者グループと権限も追加することをお勧めします。フラグを使用できない場合も同様です。

于 2013-03-06T11:31:48.980 に答える