콘텐츠로 이동

권한과 레벨

devplorer의 권한은 레벨과 능력으로 나뉩니다. 게임이 Provider로 레벨을 정하면, 서버는 요청마다 그 레벨의 능력을 기준으로 요청을 다시 검사합니다.

레벨은 세 가지이고, 위 레벨은 아래 레벨의 능력을 모두 포함합니다.

레벨 대상 새로 얻는 능력
Tester 플레이 테스터 View, Server, ServerValues, Logs
MainTester 테스터 중 가장 높은 권한을 가진 사람 Edit
Developer 개발자 Execute
능력 허용하는 일
View 클라이언트 쪽 Explorer와 Properties. 이 능력이 없으면 창에서 아무 일도 할 수 없습니다.
Server 서버 트리 보기(이름과 클래스).
ServerValues 서버 인스턴스의 속성, 특성 값, 태그 읽기. Server가 있어야 합니다.
Logs Output 보기(서버 출력 포함).
Edit 서버 트리 편집(속성, 특성, 태그, 만들기, 지우기, 옮기기, 복제)과 클라이언트 트리 편집. 서버 편집에는 Server와 ServerValues도 필요합니다.
Execute 스크립트와 관련된 편집, Remote와 Bindable 디버깅, 인터프리터.

Provider는 Server.Start에 넘기는 판정 함수입니다. 형태는 (player: Player) -> Level?입니다.

  • 요청마다 호출되므로 yield하지 않도록 가볍게 작성해야 합니다. 그룹 랭크처럼 웹 호출이 필요한 판정은 게임에서 미리 캐시해 둔 값을 읽는 방식을 권합니다.
  • 에러가 나거나 레벨이 아닌 값을 돌려주면 권한 없음으로 처리됩니다.
  • 레벨이 바뀌면 열려 있는 창을 새 레벨로 다시 보내고, 권한이 사라지면 창을 닫습니다.
Devplorer.Start({
Provider = function(player: Player): string?
if Developers[player.UserId] then
return "Developer"
end
return nil
end,
})

Provider가 읽어도 되는 값과 안 되는 값

섹션 제목: “Provider가 읽어도 되는 값과 안 되는 값”
  • 읽어도 되는 값: 코드 안의 UserId 목록, DataStore나 그룹 랭크를 캐시해 둔 서버 모듈의 테이블, 아래 Secret으로 가린 인스턴스.
  • 읽으면 안 되는 값: 플레이어의 특성, 태그, 팀, 그리고 편집할 수 있는 위치에 있는 값 객체.

Edit 권한을 받은 사람이 이런 값을 바꾸면 스스로 레벨을 올릴 수 있기 때문입니다. devplorer는 Provider가 무엇을 읽는지 알 수 없어 코드로 막을 수 없으므로, 게임 개발자가 직접 지켜야 합니다.

Provider가 읽는 인스턴스는 Secret으로 가린 곳(예: ServerStorage) 아래에 두는 것을 권합니다.

서버 콘솔(F9)에서 서버 코드를 실행할 수 있는 개발자는 Provider와 별개로 권한을 직접 줄 수 있습니다. 콘솔에서 준 권한은 해당 서버가 살아 있는 동안 Provider보다 우선합니다.

local D = require(game.ServerStorage.Devplorer.Server)
D.Grant("Username", "MainTester")
D.Open("Username")
명령 하는 일
Grant(대상, 레벨) 해당 서버에서 레벨을 줍니다. 창이 열려 있으면 새 레벨로 다시 보냅니다.
Open(대상) 권한이 있으면 창(번들)을 보냅니다.
Close(대상) 창만 닫습니다. 권한은 그대로입니다.
Revoke(대상) 해당 서버에서 권한을 없앱니다. Provider가 준 권한도 막고 창을 닫습니다.
Reset(대상) 콘솔로 덮어쓴 권한을 지우고 Provider의 판정으로 돌아갑니다.
List() 서버에 있는 플레이어의 레벨, 덮어쓴 권한, 창 상태를 출력하고 테이블로도 돌려줍니다.

대상은 Player, UserId(숫자), 사용자명(문자열)으로 지정할 수 있습니다.

  • Grant, Revoke, Reset은 사용자명(대소문자 무시, 정확히 일치)과 UserId만 받습니다. 표시 이름은 다른 사람의 사용자명과 같게 지을 수 있어서 받지 않습니다.
  • Open과 Close는 표시 이름도 받습니다. 표시 이름이 둘 이상 겹치면 후보를 보여 주고 에러를 냅니다.
  • 아직 서버에 들어오지 않은 사람에게 Grant를 쓰려면 UserId로 지정하면 됩니다.
  • 레벨 이름을 잘못 쓰면 에러가 납니다. 오타로 권한이 바뀌는 일을 막기 위해서입니다.

Start의 LevelCapabilities로 레벨마다 능력을 다시 정할 수 있습니다. 여기에 적은 레벨은 적힌 능력만 가집니다(아래 레벨의 능력이 누적되지 않습니다). 적지 않은 레벨은 기본 구성을 따릅니다.

Devplorer.Start({
Provider = provider,
LevelCapabilities = {
-- 서버 값 읽기는 MainTester부터
Tester = { "View", "Server", "Logs" },
},
})
  • 알 수 없는 레벨이나 능력 이름을 쓰면 Start가 에러를 냅니다.
  • View가 없는 레벨이 있으면 그 레벨의 창에서는 아무 일도 할 수 없으므로 Start가 경고를 출력합니다.
  • 서버 편집에는 Server, ServerValues, Edit가 모두 필요합니다.

디버그 액션과 인터프리터의 권한

섹션 제목: “디버그 액션과 인터프리터의 권한”
  • 디버그 액션은 액션마다 MinLevel을 가지며, 기본값은 Developer입니다. 자세한 내용은 디버그 액션에서 다룹니다.
  • 인터프리터는 Execute 능력이 있는 사람만 쓸 수 있고, 게임이 컴파일러를 넘긴 경우에만 켜집니다. 자세한 내용은 인터프리터 켜기에서 다룹니다.