匿名モードのユーザーをグループに自動追加できません

こんにちは、皆さん!

Discourse 2.6.0beta3 でフォーラムを運用しており、バグではないかと思う問題に遭遇しました。

匿名ユーザーを anons というグループに追加し、特定のカテゴリでの投稿を制限できるようにしたいと考えています。そのため、グループ anons に、メールドメインが anon.mydomain のユーザーを自動的に追加する設定を行いました。

匿名モードでアクセスすると、匿名アカウントがそのグループに追加されていないことがわかります。しかし、/g/anons/manage/membership の「変更を保存」ボタンをクリックすると、匿名アカウントがそのグループに追加されます。クリック操作なしで、匿名モードに入る際に自動的に匿名ユーザーをこのグループに追加したいのです。

このバグについて検索しましたが、役立つ情報は見つかりませんでした。お読みいただき、ありがとうございます!

「いいね!」 1

匿名モードでユーザーがログインした際、あなたが報告している現象を再現できます。匿名のメールアドレスドメインに基づいてユーザーを自動的にグループに追加するには、匿名グループの管理ページに移動し、設定を保存する必要があります。

匿名のメールアドレスドメインに基づいて匿名ユーザーをグループに追加する機能が期待通りに動作するかどうかは確信が持てません。しかし、すべての匿名ユーザーをグループに含めることは確かに有用だと考えられます。メールアドレスドメインに基づいて匿名ユーザーをグループに追加するというアプローチは、Meta で何度か提案されています。代替案として、すべての匿名ユーザーを指定されたグループに自動的に追加する「匿名モード用グループ」設定を追加するという方法もあります。

これが Discourse がサポートすべき機能かどうかを判断する前に、まず確認してみましょう。

「いいね!」 3

この機能において匿名メールに依存するのはリスクがあると思います。代わりに、匿名ユーザー向けの別の自動グループを設け、自動的にそこに追加することを検討すべきでしょう。

ただし、これはバグとは考えていないため、カテゴリを再分類します。

「いいね!」 3

こんにちは。私が設定・管理をお手伝いしているフォーラムで発生している問題に関連するトピックです。いくつかの背景を説明します。このフォーラムでは、投稿可能なユーザーとして参加するには有料登録が必要です。また、一定の信頼レベル(トラストレベル)に達した有料メンバーが、匿名モードに切り替えて匿名で投稿できるようにしたいと考えています。さらに、スタッフ限定のコンテンツを除き、すべてのユーザーがコンテンツを読めるようにしたいと考えています。

私の理解では、匿名ユーザーは自動的に「everyone」ユーザーグループのメンバーとなります。もし世界中の誰でもフォーラムに投稿できるように設定していたなら、匿名ユーザーが投稿できないという問題は発生しなかったでしょう。しかし、有料フォーラムであるため、「everyone」グループを「読み取り専用」に設定しており、一般ユーザーは閲覧できても投稿はできないようにしています。

それでも、必要な信頼レベルを持つユーザーが匿名で投稿できるようにしたいと考えています。当初の解決策として、匿名メールドメインに基づいてユーザーを自動的に追加し、投稿権限を持つ「匿名ユーザーグループ」を設定する予定でした。しかし、自動追加の機能が正常に動作しておらず、匿名ユーザーが実際にグループに追加されるためには、管理者が手動で匿名ユーザーグループに移動し、変更を保存する必要があります。これは非常に面倒で、私たちが目指しているフロー(有料メンバーが必要な信頼レベルに達すれば、匿名モードに切り替えて自由に匿名投稿できること)を妨げています。

匿名ユーザーのグループへの自動追加は、Discourseに追加される可能性のある機能として検討されているが、まだ実装されていないと推測しています。もしその場合、Discourseを別の合理的な方法で設定して目的を達成できるでしょうか、それとも、Discourseの開発者がこの機能を追加してくれるのを待つしかないのでしょうか?よろしくお願いいたします。

ユーザーのすべてのグループを、シャドウが作成されたときにそのシャドウにコピーするプラグインを作成しました。

免責事項:私はRubyに全くの初心者であり、私の環境では動作しますが、他の環境でも動作するかどうかは全くわかりません。

「いいね!」 2

この機能に賛成です。実装されましたか?見当たりません。あるいは、これを行うプラグインをご存知の方はいらっしゃいますか?

(参考:これはまともな回避策のように思えます。こちらで見つけました。)

ユーザーの1人が、フォーラムグループに匿名アカウントを自動的に追加するプラグインを作成しました。こちらが私が使用しているGitHubのフォークです。GitHub - curi/cf-anon-auto-group: Discourse plugin to trigger `user.set_automatic_groups` for anons on login 問題なく動作しています。

これにより、投稿を許可するために適切な権限を付与する必要があります。

他の人もこのソリューションを使用したり、より公式なプラグインを作成したり、コードをマージしたりできるかもしれません。

これは、メールによる自動グループメンバーシップ設定と組み合わせて機能します(当社の経験では、これだけでは機能しませんでした)。

参考までに、私が運営しているフォーラムでデータベースレベルでこの問題を「解決」しました。他の、より高レベルな解決策が機能しない場合にのみ使用してください(これに関して進捗はありましたか、それとも既存の返信のいずれかを「解決済み」としてフラグを立てるべきですか?)。以下はPostgreSQLコードです。

create or replace function anon_insert_copy_groups_to_anon_user()
  RETURNS TRIGGER
  LANGUAGE PLPGSQL
  AS $$
declare
  anon_user_id integer = new.user_id;
  master_user_id integer = new.master_user_id;
  active boolean = new.active;
  created_at timestamp = new.created_at;
  updated_at timestamp = new.updated_at;
BEGIN
  insert into group_users
        (group_id,                user_id,       created_at,        updated_at,        owner, notification_level,     first_unread_pm_at)
  select group_users.group_id, anon_user_id , current_timestamp, current_timestamp, false, 3 as notification_level, current_timestamp
  from group_users
  where group_users.user_id=master_user_id
  and   group_users.group_id not in (select group_id from group_users where group_users.user_id=anon_user_id)
  and   group_users.group_id not in (1, 2, 3); -- 管理者、モデレーター、スタッフを除く!

  return new;
end;
$$;

-- トリガーを作成する
CREATE TRIGGER anon_insert_trigger
AFTER INSERT ON anonymous_users
  FOR EACH ROW
    EXECUTE FUNCTION anon_insert_copy_groups_to_anon_user();