오류로 인해 관리자 권한을 부여할 수 없음

안녕하세요!

사용자에게(사실 어떤 사용자에게든) 관리자 권한을 부여하려고 하면 확인 링크를 클릭한 후 다음과 같은 오류 메시지만 표시됩니다:

로그를 확인해 보니 다음과 같은 메시지를 발견했습니다:

ActiveRecord::RecordInvalid (Validation failed: Name has already been taken) app/models/group.rb:607:in 'refresh_automatic_group!' app/models/group.rb:666:in 'block in refresh_automatic_groups!' app/m

Failed to handle exception in exception app middleware : ActiveRecord::RecordInvalid : Validation failed: Name has already been taken

대략 같은 시점에 MaxMind가 제대로 작동하지 않는다는 메시지도 함께 표시됩니다. 이것이 이 문제와 관련이 있는지 확실하지 않습니다(관리자 인터페이스에서 관련 설정을 찾지 못했기 때문이죠):

MaxMindDB (/var/www/discourse/vendor/data/GeoLite2-City.mmdb) could not be found: No such file or directory @ rb_sysopen - /var/www/discourse/vendor/data/GeoLite2-City.mmdb

이 문제를 어떻게 더 디버깅할 수 있을까요?

감사합니다,
Hannes

“관리자 권한 부여” 버튼을 클릭하면 그 오류가 나타나요?

아니요, “관리자 권한 부여” 버튼을 클릭하면 작동합니다.

전체 과정은 다음과 같습니다:

  1. “관리자 권한 부여” 버튼을 클릭하면, "새 관리자를 확인하기 위해 이메일을 보냈습니다. 이메일을 열어 지시사항을 따라 주세요."라는 모달 창이 표시됩니다.
  2. 이메일의 확인 링크(“관리자 계정 확인”)를 클릭하면 확인 페이지로 이동합니다.
  3. 확인 페이지에서 “관리자 액세스 권한 부여” 버튼을 클릭하면 오류 페이지(원래 게시글의 스크린샷 참조)가 표시되고 로그에 오류 메시지가 기록됩니다.

또한 로그의 더 위쪽에 다음 메시지가 표시되는 것을 방금 발견했습니다(숫자 46으로 시작합니다 - 이것이 46번 반복되었음을 의미합니까?):

Error ensuring consistency for Group: Validation failed: Name has already been taken

이것은 매우 흥미로운 엣지 케이스인 것 같습니다. 셀프 호스팅을 가정할 때, 이것이 무엇을 반환하나요?

./launcher enter app
rails c
Group.pluck(:name, :id)
=> [["everyone", 0],
 ["moderators", 2],
 ["admins", 1],
 ["staff", 3],
 ["trust_level_0", 10],
 ["trust_level_1", 11],
 ["trust_level_2", 12],
 ["trust_level_3", 13],
 ["trust_level_4", 14]]

Discourse는 이러한 ID에 대해 매우 엄격합니다. staff는 2여야 하고, admins는 1이어야 합니다. 만약 동일한 이름의 다른 그룹이 있다면 문제가 생길 수 있습니다. 또한 admins라는 이름의 사용자가 없도록 확인하는 것도 좋습니다.

아래와 같이 보입니다. (조금 더 많은 그룹이 있지만, 이들은 분명히 우리가 만든 것이며 시스템 그룹과 유사성이 없어서 아래에 포함하지 않았습니다):

=> [["everyone", 0],
 ["moderators", 2],
 ["admins", 1],
 ["trust_level_0", 10]
 ["trust_level_1", 11],
 ["trust_level_2", 12],
 ["trust_level_3", 13],
 ["trust_level_4", 14],
 ["Staff", 42]]

staff 그룹이 없고 Staff만 있는 것을 확인했습니다. staff가 항상 id 3인 것이라면, 누군가가 이를 삭제하고 새로운 그룹(id 42)을 생성한 것으로 보입니다.

다시 staff를 생성하는 것만으로 충분한가요, 아니면 어떻게 해결할 수 있을까요?

네, 직원 그룹 이름을 변경하면 문제가 해결될 것 같아요.

1개의 좋아요

UI에서 이를 수행할 수 없습니다:

데이터베이스(DB)에서 직접 이 작업을 수행해야 하나요?

명령줄을 사용하여 그룹 이름을 변경할 수 있나요, 아니면 이 상황을 어떻게 해결할 수 있을까요?

그럼 DB에서 직접 시도해 보세요. 안전할 겁니다.

2개의 좋아요

네, 그 방법이 효과가 있었습니다! 그룹은 존재했지만 누군가가 이름을 변경한 것이었습니다 - 이는 핵심 기능을 기본적으로 깨뜨리기 때문에, UI에서 시스템 그룹의 이름 변경을 허용하지 않아야 하는지 궁금합니다.

기록을 위해, 유사한 상황에 처한 분들을 위해:

docker exec -it app /bin/bash
su - postgres
psql -d discourse
discourse=# update groups set name='staff' where id=3;
\q
5개의 좋아요

네, 절대 들어갈 수 없는 상태여야 합니다.

3개의 좋아요