저는 Discourse 2.6.0beta3로 포럼을 운영하고 있으며, 버그를 발견한 것 같습니다.
특정 카테고리에서의 게시물을 제한할 수 있도록匿名用户(anonymous users)를 anons라는 그룹에 추가하려고 합니다. 이메일 도메인 anon.mydomain을 기준으로 사용자를 자동으로 해당 그룹에 추가하도록 그룹 anons를 설정했습니다.
익명 모드에 진입하면 제 익명 계정이 해당 그룹에 추가되지 않았습니다. 하지만 /g/anons/manage/membership 페이지에서 Save Change(변경 사항 저장) 버튼을 클릭하면 제 익명 계정이 이 그룹에 추가됩니다. 저는 버튼을 클릭하지 않고 익명 모드에 진입할 때만 자동으로 익명 사용자를 이 그룹에 추가되기를 원합니다.
사용자가 익명 모드를 활성화할 때 발생하는 문제를 재현할 수 있습니다. 익명 이메일 도메인을 기준으로 사용자를 자동으로 특정 그룹에 추가하려면, 익명 그룹의 관리 페이지로 이동하여 설정을 저장해야 합니다.
익명 이메일 도메인을 기준으로 익명 사용자를 그룹에 추가하는 기능이 의도된 동작인지 확실하지 않습니다. 모든 익명 사용자를 하나의 그룹에 모을 수 있다면 유용할 것 같습니다. 익명 사용자의 이메일 도메인을 기준으로 그룹에 추가하는 방식은 Meta에서 몇 번이나 제안된 바 있습니다. 대안으로, anonymous mode group 설정을 추가하여 모든 익명 사용자를 선택한 그룹에 자동으로 추가하는 방식을 고려해 볼 수 있습니다.
이것이 버그인지 여부를 결정하기 전에, Discourse가 이 기능을 지원하기를 원하는지 먼저 확인해 보겠습니다.
안녕하세요, 이 주제가 제가 세팅/관리하는 포럼에서 겪고 있는 문제와 관련이 있습니다. 배경을 설명드리자면, 이 포럼은 게시글을 작성할 수 있는 사용자로 가입하려면 비용을 지불해야 합니다. 또한, 특정 신뢰 수준(trust level)을 갖춘 유료 회원이 익명 모드로 전환하여 익명으로 게시글을 작성할 수 있도록 하려는 계획도 있습니다. 아울러 스태프 전용 내용과 같은 예외를 제외하고, 모든 사람이 콘텐츠를 읽을 수 있도록 하고 싶습니다.
제 이해로는, 익명 사용자가 자동으로 ‘everyone’ 사용자 그룹에 포함된다고 알고 있습니다. 만약 포럼에서 전 세계 누구나 게시글을 작성할 수 있도록 한다면, 익명 사용자가 게시글을 작성할 수 없는 문제는 발생하지 않을 것입니다. 하지만 이 포럼은 유료 포럼이기 때문에, 전 세계는 읽기만 가능하고 작성은 불가능하도록 ‘everyone’ 사용자 그룹을 읽기 전용(read-only)으로 설정해 두었습니다.
그럼에도 불구하고, 필요한 신뢰 수준을 갖춘 사용자가 익명으로 게시글을 작성할 수 있도록 하려는 것입니다. 원래 계획했던 해결책은 게시글 작성 권한이 있는 익명 사용자 그룹을 만들고, 포럼에서 사용하는 익명 이메일 도메인에 기반하여 사람들을 추가하는 것이었습니다. 하지만 자동 추가 기능이 작동하지 않고 있습니다 - 실제로 익명 사용자가 추가되려면 관리자가 익명 사용자 그룹에 들어가서 변경 사항을 저장해야 합니다. 이는 꽤 번거롭고, 우리가 원하는 흐름을 방해합니다. 우리가 원하는 것은 필요한 신뢰 수준을 갖춘 유료 회원이 익명 모드로 전환한 후, 익명 게시글 작성을 자유롭게 할 수 있는 것입니다.
익명 사용자가 자동으로 그룹에 추가되는 기능은 Discourse에 추가될 가능성이 고려되고 있지만 아직 구현되지 않은 것으로 보입니다. 만약 그렇다면, 제가 원하는 결과를 얻기 위해 Discourse를 구성할 다른 합리적인 방법이 있을까요, 아니면 이 기능이 추가되기를 Discourse 개발팀에 기대하며 기다려야만 할까요? 감사합니다
참고로, 저는 이 문제를 제가 운영하는 포럼에서 데이터베이스 레벨에서 "해결"했습니다. 다른 더 고수준의 솔루션을 사용할 수 없는 경우에만 이 방법을 사용하세요. (이 문제에 대해 어떤 진전이 있었나요, 아니면 기존 답변 중 하나를 "해결됨"으로 표시해야 하나요?)
다음은 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();