web-dev-qa-db-ja.com

サイトに表示されているはずのユーザーを無効にするにはどうすればよいですか?

ブロックされたユーザーアカウントのユーザー名が匿名ユーザーのビューに表示されない は基本的に私が尋ねているのと同じ質問ですが、承認された回答または私にとって有効なものはありません。これは私の質問とは異なる見方です。

別のCMSからサイトを移行しています。私は、サイトのユーザーとして過去と現在の両方のスタッフを引き継ぎます。移行の一環として、組織に参加していないユーザーは、サイトにログインできないようにブロックされているとマークされています。

これらのユーザーは、さまざまなエンティティ参照フィールドを介してサイトのノードに関連付けられます。私が遭遇する問題は、匿名ユーザーの場合、実際に自分のアカウントにバイパスアクセス制御を持たない人にとっては、これらのユーザーアカウントが表示されないことです。

ユーザーがアカウントにログインできないようにしながら、アカウントを表示したままにする適切な方法は何ですか?私にとって、答えは何かである必要があります Migrate Module で動作します。

明らかに、ユーザーをブロックすることは、私にとってそれを行うための明白な方法のように見えましたが、ブロックされたユーザー情報へのアクセスを許可する権限を見つけることができません。これを行う別の方法はありますか、またはブロックされたアカウント情報を表示する方法はありますか?

私の解決策

@kiamlalunoからの受け入れられた回答に基づいて、私は私のために働く解決策を作成しました:

各ユーザーのend_dateフィールド(field_user_end_date)はすでにあるので、ほとんどの場合、これはログインの制限要因として十分ですが、関係者との議論に基づいて、追加の管理者のみブールフィールドを追加しましたfield_user_account_lockedという名前です。

検証関数をフォームに追加するためにhook_form_alterを実装します。

function mymodule_form_alter(&$form, &$form_state, $form_id)
{
    if ($form_id == 'user_login' || $form_id == 'user_login_block') {
        $form['#validate'][] = 'mymodule_user_login_validate';
    }
}

そして、これが私の検証モジュールです:

function mymodule_user_login_validate($form, &$form_state)
{
    if (!empty($form_state['uid'])) {
        // The user trying to login is not limited by flood control;
        // user_login_authenticate_validate() found a user with the username and password entered in the login form.
        $user = user_load($form_state['uid']);
        $end_date = (isset($user->field_user_end_date[LANGUAGE_NONE][0]['value'])) ? strtotime($user->field_user_end_date[LANGUAGE_NONE][0]['value']) : time() + 300000;
        if ($end_date < time() || $user->field_user_account_locked[LANGUAGE_NONE][0]['value'] == 1) {
            form_set_error('name', t('The username %name cannot be used to login.', array('%name' => $form_state['values']['name'])));
        }
    }
}

何か建設的な批評があれば教えてください。

3
UltraBob

カスタムモジュールを使用して、ユーザープロファイルを表示する権限を変更できます。たとえば、次のコードはDrupal 7に使用できます。

_function mymodule_permission() {
  return array(
    'access blocked user profiles' => array(
      'title' => t('View user profiles of blocked users'),
    ),
  );
}

function mymodule_menu_alter(&$items) {
  if (isset($items['user/%user'])) {
    $items['user/%user']['access callback'] = 'mymodule_view_access';
  }
}

function mymodule_view_access($account) {
  $uid = is_object($account) ? $account->uid : (int) $account;

  // Never allow access to view the anonymous user account.
  if ($uid) {
    // Admins can view all, users can view own profiles at all times.
    if ($GLOBALS['user']->uid == $uid || user_access('administer users')) {
      return TRUE;
    }
    elseif (user_access('access user profiles')) {
      // At this point, load the complete account object.
      if (!is_object($account)) {
        $account = user_load($uid);
      }
      if (is_object($account)) {
        // If the account is blocked, show the profile to users with the right
        // permission.
        return ($account->status ? TRUE : user_access('access blocked user profiles'));
      }
    }
  }
  return FALSE;
}
_

匿名ユーザーに新しい権限を与えると、ブロックされたユーザーのユーザープロファイルを表示できます。

これはおそらく、パスワードと電子メールを変更するよりも簡単であり、現在の従業員を誤ってブロックした場合は、元に戻すのが簡単です。アカウントのブロックを解除するだけです。

私が示したコードは、ユーザープロファイルへの直接アクセス、およびユーザーがアクセスユーザープロファイルリンクを表示するアクセス許可を持っていることのみを確認するモジュールで機能しますユーザープロファイルに。これがDrupalが行うことです。たとえば template_preprocess_username() のようになります。

_  $variables['profile_access'] = user_access('access user profiles');
  $variables['link_attributes'] = array();
  // Populate link path and attributes if appropriate.
  if ($variables['uid'] && $variables['profile_access']) {
    // We are linking to a local user.
    $variables['link_attributes'] = array('title' => t('View user profile.'));
    $variables['link_path'] = 'user/' . $variables['uid'];
  }
  elseif (!empty($account->homepage)) {
    // Like the 'class' attribute, the 'rel' attribute can hold a
    // space-separated set of values, so initialize it as an array to make it
    // easier for other preprocess functions to append to it.
    $variables['link_attributes'] = array('rel' => array('nofollow'));
    $variables['link_path'] = $account->homepage;
    $variables['homepage'] = $account->homepage;
  }
_

theme('username')(_template_preprocess_username_がプリプロセス関数)を使用してユーザー名を表示するモジュールは、現在ログインしている場合、表示されているユーザーアカウントがブロックされていても、ユーザープロファイルへのリンクを印刷します-inユーザーには、アクセスユーザープロファイル権限があります。

ユーザープロファイルへのリンクを表示する前にユーザーアカウントがブロックされていることを確認するモジュールがある場合、このメソッドは機能しません。

この場合、私が採用する代替案は次のとおりです。

  • これらの元従業員のユーザーアカウントをブロックしないでください
  • アカウントを使用してログインできるかどうかを示すフラグをユーザーアカウントに追加する
  • ログインフォームに追加の検証ハンドラーを使用して、これらのアカウントの1つがログインに使用されている場合はエラーを返します
_function mymodule_form_alter(&$form, &$form_state, $form_id) {
  if ($form_id == 'user_login' || $form_id == 'user_login_block') {
    $form['#validate'][] = 'mymodule_user_login_validate';
  }
  elseif ($form_id == 'user_register_form') {
    $form['account']['can_login'] = array(
      '#type' => 'checkbox',
      '#title' => t('The user account can be used to log in'),
      // The form is for registering a new user; there is nothing to load from the database.
      '#default_value' => TRUE,
      // See user_register_form() which set the following value to TRUE if
      // the currently logged-in user administer users.
      '#access' => $form['administer_users']['#value'],
    );
    $form['#submit'][] = 'mymodule_register_submit';
  }
  elseif ($form_id == 'user_profile_form') {
    if ($form['#user_category'] == 'account') {
      $form['account']['can_login'] = array(
        '#type' => 'checkbox',
        '#title' => t('The user account can be used to log in'),
        '#default_value' => mymodule_load_flag($form['#user']->uid),
        '#access' => user_access('administer users'),
      );
      $form['#submit'][] = 'mymodule_profile_submit';
    }
  }
}

function mymodule_user_login_validate($form, &$form_state) {
  if (!empty($form_state['uid'])) {
    // The user trying to login is not limited by flood control;
    // user_login_authenticate_validate() found a user with the username and password entered in the login form.
    if (!mymodule_load_flag($form_state['uid'])) {
      form_set_error('name', t('The username %name cannot be used to login.', array('%name' => $form_state['values']['name'])));
    }
  }
}

function mymodule_register_submit($form, &$form_state) {
  if ($form_state['values']['administer_users']) {
    // The user submitting the form can administer users. 
    // user_register_submit() sets $form_state['values']['uid']; save it in
    // a database table the module creates when installed.
    mymodule_save_flag($form_state['values']['uid'], $form_state['values']['can_login']);
  }
}

function mymodule_profile_submit($form, &$form_state) {
  if (user_access('administer users') && $form['#user_category'] == 'account') {
    // user_profile_submit() sets $form_state['values']['uid']; save it in
    // a database table the module creates when installed.
    mymodule_save_flag($form_state['values']['uid'], $form_state['values']['can_login']);
  }
}
_
2
kiamlaluno

すべてのユーザーを ビュー で表示します。ビューはすべてのデータをすべての人に表示することができます(そのため、注意が必要です)。

ユーザーを一覧表示するビューを作成する場合、ステータスでフィルターするオプションがあります。そのフィルターを省略すると、システム内のすべてのユーザーがブロックおよびブロック解除された状態でリストされます。それでも機能しない場合は、デフォルトの「ユーザープロファイルの表示」権限を別の権限に変更します。

  1. ビューモジュールをインストールして有効にします。
  2. 「ユーザー」をリストするビューを作成します。
  3. さらにフィルターを追加します。
  4. 権限を確認してください。
1
Neograph734