Lockdown 확장은 특정 이름 공간(namespaces) 및 특수 지면(special pages)에 대한 접근을 주어진 사용자 그룹 집합으로 제한하는 방법을 구현합니다. 이것은 미디어위키에서 기본인 $wgGroupPermissions 및 $wgNamespaceProtection 설정에 의해 제공되는 보안 모델보다 세분화된 보안 모델을 제공합니다.
기본적으로 미디어위키에 의해 사용되는 보안 모델에 대한 다음 페이지는 아래 지침을 이해하기 위해서 도움이 될 수 있습니다:
Installation
미디어위키 확장 내려받기 지면에서 해당 판을 내려받아서 정해진 위치로 이동시킵니다.
미디어위키 설정 LocalSettings.php 파일에 다음을 추가합니다:
wfLoadExtension( 'Lockdown' );
Special:Version에 접근해서 확장이 정상적으로 설치가 되었는지 확인을 합니다.
Example
Lockdown을 사용하여 Special:Export에 대한 접근을 방지하고 프로젝트 이름 공간의 편집을 로그인한 사용자 (등록된 사용자)로 제한하려면 다음을 사용할 수 있습니다:
$wgSpecialPageLockdown['Export'] = [ 'user' ];
$wgNamespacePermissionLockdown[NS_PROJECT]['edit'] = [ 'user' ];
설명과 추가 예제는 아래를 참조하십시오.
Configuration
Lockdown 확장은 단지 제한만 가능하며, 허가를 조절할 수는 없습니다. 미디어위키에서 제한한 접근 권한을 Lockdown 확장을 사용해서 허가할 수는 결코 없습니다.
$wgSpecialPageLockdown
$wgSpecialPageLockdown는 사용자 그룹에 따라 특수 지면에 대한 접근 제한을 구현해 줍니다. 예를 들어, 로그인한 사용자들에게만 Special:Export를 접근할 수 있도록 제한하기 위해서는 미디어위키 설정에 다음을 추가해 줍니다:
$wgSpecialPageLockdown['Export'] = array('user');
일부 특수 페이지에는 "기본적으로" 특정 권한이 필요합니다. 예를 들어, 페이지를 이동하는 데 사용할 수 있는 Special:MovePage에는 "move" 권한이 필요합니다 (기본적으로 로그인한 사용자에게만 부여됨). 이 제한은 Lockdown 확장을 사용하여 덮어쓸 수 없습니다.
어떤 특수 지면 이름은 위키에 보이는 것처럼 대문자를 사용해서는 안됩니다. 예를 들어, Special:RecentChanges 는 내부적으로는 Recentchanges로 사용되기 때문에, 접근 제한이 다음과 같이 설정해야 합니다:
$wgSpecialPageLockdown['Recentchanges'] = array('user');
특수 지면 이름에 대한 전체 목록은 languages/message/MessageEn.php 파일의 $specialPageAliases 배열에 있습니다.
$wgActionLockdown
$wgActionLockdown을 사용하면 사용자 그룹이 접근할 수 있는 각 action을 지정할 수 있습니다. 예를 들어, 기록 페이지의 사용을 로그인한 사용자로 제한하기 위해서는, LocalSettings.php에서 다음을 사용하십시오:
$wgActionLockdown['history'] = array('user');
일부 동작은 이 방법으로 잠글 수 없다는 것에 주목하십시오. 특히, ajax 동작에는 작동하지 않습니다.
$wgNamespacePermissionLockdown
$wgNamespacePermissionLockdown은 이름 공간에 대한 권한을 가진 사용자 그룹을 제한합니다. 예를 들어, 프로젝트 이름 공간에 대한 쓰기 권한을 sysop 그룹의 구성원에게만 부여하려면 다음을 사용하십시오:
$wgNamespacePermissionLockdown[NS_PROJECT]['edit'] = array('sysop');
이름 공간 또는 권한(둘 다 동시에 사용할 수 없음)에 대한 와일드 카드가 지원됩니다. 보다 구체적인 정의가 우선합니다:
$wgNamespacePermissionLockdown[NS_PROJECT]['*'] = array('sysop');
$wgNamespacePermissionLockdown[NS_PROJECT]['read'] = array('*');
$wgNamespacePermissionLockdown['*']['move'] = array('autoconfirmed');
처음 두 행은 프로젝트 이름 공간의 모든 권한을 sysop 그룹의 구성원으로 제한하지만, 다른 사람에게 읽기를 허용합니다. 세 번째 행은 모든 이름 공간의 페이지 이동을 자동 확인 그룹의 구성원으로 제한합니다.
주목할 것은 이렇게 하면, 빌드-인 $wgGroupPermissions 설정에서 허용되지 않은 사용 권한을 *부여*할 수 없다는 점입니다. 다음은 일반 사용자가 메인 이름 공간에서 순회 편집을 허용하지 *않는다*는 점입니다:
$wgNamespacePermissionLo}ckdown[NS_MAIN]['patrol'] = array('user');
대신에, 먼저 $wgGroupPermissionsfirst에서 이 권한을 부여하고, 그런 다음 $NamespacePermissionLockdown을 사용하여 제한해야 합니다:
$wgGroupPermissions['user']['patrol'] = true;
$wgNamespacePermissionLockdown['*']['patrol'] = array('sysop');
$wgNamespacePermissionLockdown[NS_MAIN]['patrol'] = array('user');
주목할 것은 이름 공간에 대한 읽기 접근을 제한할 때 사용자가 다른 이름 공간에 대한 읽기 접근 권한을 갖고 있는 경우에는 제한 사항을 쉽게 피할 수 있습니다. 즉, 읽기 방지된 페이지를 템플릿으로 포함하여 볼 수 있습니다. 이것을 피하려면 이름 공간의 ID를 $wgNonincludableNamespaces에 추가하여 이름 공간의 페이지를 템플릿으로 사용하지 못하게 해야 합니다(이 기능은 MediaWiki 1.10, 개정판 19934에 도입되었으며, 그리고 또한 이전 버전에 대해서 확장으로 사용할 수도 있음):
$wgNamespacePermissionLockdown[NS_PROJECT]['read'] = array('user');
$wgNonincludableNamespaces[] = NS_PROJECT;
물론 $wgExtraNamespaces를 사용하여 정의된 사용자 정의 이름 공간과 함께 Lockdown을 사용할 수도 있습니다:
#define custom namespaces
$wgExtraNamespaces[100] = 'Private';
$wgExtraNamespaces[101] = 'Private_talk';
#restrict "read" permission to logged in users
$wgNamespacePermissionLockdown[100]['read'] = array('user');
$wgNamespacePermissionLockdown[101]['read'] = array('user');
#prevent inclusion of pages from that namespace
$wgNonincludableNamespaces[] = 100;
$wgNonincludableNamespaces[] = 101;
주목할 것은 사용자 정의 이름 공간은 항상 쌍으로 정의되어야 하며, 적절한 이름 공간(짝수 ID 포함) 및 연관된 토론 이름 공간(홀수 ID 포함)으로 정의해야 한다는 점입니다.
만약 상수를 사용하여 이름 공간을 참조하려면, 이를 정의해야 합니다:
#define constants for your custom namespaces, for a more readable configuration
define('NS_PRIVATE', 100);
define('NS_PRIVATE_TALK', 101);
#define custom namespaces
$wgExtraNamespaces[NS_PRIVATE] = 'Private';
$wgExtraNamespaces[NS_PRIVATE_TALK] = 'Private_talk';
#restrict "read" permission to logged in users
$wgNamespacePermissionLockdown[NS_PRIVATE]['read'] = array('user');
$wgNamespacePermissionLockdown[NS_PRIVATE_TALK]['read'] = array('user');
#prevent inclusion of pages from that namespace
$wgNonincludableNamespaces[] = NS_PRIVATE;
$wgNonincludableNamespaces[] = NS_PRIVATE_TALK;
array_fill()을 사용하여 한 번에 여러 이름 공간을 제한할 수도 있습니다, 예를 들어, 만약 이름 공간 0에서 2009까지를 sysops만 편집하도록 제한하려면, 다음을 추가하십시오:
$wgNamespacePermissionLockdown = array_fill( 0, 2010, array( 'edit' => array( 'sysop' ) ) );