3

私は symfony 1.4 と sfGuardDoctrinePlugin を使用しています。インストールして問題なくセットアップできましたが、次の問題があります。

管理者としてログインし、ユーザーのアクセス許可を更新すると、そのユーザーはログアウトしてから再度ログインしてから、新しく追加された資格情報/アクセス許可を取得する必要があります。

これを回避する方法はありますか?

これを修正するのがどれほど簡単かはわかりません。ユーザーがログインすると、資格情報がセッション属性に追加されると思います。そのため、管理者が資格情報を更新しても、セッションは古い資格情報を保持しています。これは、hasCredential への呼び出しが「ライブ」ではないことを意味します。

ありがとう

4

3 に答える 3

2

これにより、アプリケーションへのすべてのリクエストに余分なクエリが追加されます。によって資格情報の更新を強制することができます$user->getSfGuardUser()->refresh(true)。これにより、エンティティとそのすべての関係 (およびそのアクセス許可) がリロードされます。

于 2010-09-21T12:25:37.603 に答える
1

ご回答ありがとうございます。sfGuardUserモジュールのアクションクラスのprocessForm関数を変更しました。

ログインして自分の権限を変更すると、その場でセッションが更新されます。

私の問題は、別のユーザーのユーザー権限を編集する場合、そのユーザーのセッションデータを編集する必要があることです。これを解決するために、データベースセッションを有効にしたので、ファイルではなくセッションを保存するようになりました。したがって、次の問題は、他のユーザーのセッションを分離する方法です。

セッションデータベースには、sess_id、sess_data、sess_timeの列があります。

sess_dataはシリアル化されており、それを更新する必要があります。

しかし、symfonyはセッションIDを頻繁に更新するので、他のユーザーの正しいセッションを常に分離するのは難しいと思います。

シリアル化を解除してuser_idを確認してから、データを再シリアル化するのも遅いと思います。user_id列が必要だと思います。

于 2010-09-22T12:26:12.717 に答える
0

これは古い質問であることは知っていますが、最近同じ問題が発生し、回答を見つけるのに必要以上に時間がかかりました (Symfony のコード スニペット セクションに投稿されています)。この関数を myUser クラスに貼り付けると、すべての問題が解消されます。

/**
   * Overridden method that actually reads the permission from DB
   * instead of relying on data present when the user logs in.
   *
   * @param  string  permission name
   *
   * @return boolean true if the user has credential
   */
  public function hasCredential($permission_name)
  {
    if (!$this->isAuthenticated()) {
      return false;
    }
    $gu = $this->getGuardUser();
    $groups = $gu->getGroups();
    $permissions = $gu->getPermissions();

    $permission_names = array();
    foreach($permissions as $permission) {
      $permission_names[] = $permission->getName();
    }
    foreach($groups as $group) {
      $group_permissions = $group->getPermissions();
      foreach($group_permissions as $group_permission) {
        $permission_names = array_merge($permission_names, array($group_permission->getName()));
      }
    }
    $permission_names = array_unique($permission_names);
    return (in_array($permission_name, $permission_names)) ? true : false;
    }
于 2012-02-23T21:49:02.317 に答える