首頁‎ > ‎電子期刊‎ > ‎Semantic MediaWiki‎ > ‎

MediaWiki帳號整合心得


前言

談應用系統整合,帳號是第一步需要整合的應用系統要素,而帳號整合一直有個很響亮的名字叫做單一簽入(Single Sign On);大家都期待只需要記憶一組帳號密碼就可以通行無阻。

帳號管理幾乎是每個系統所會遇到的課題,最簡單的開個資料庫使用者表格加上帳號密碼就搞定,好一點的會將密碼加密;而大部份系統對於帳號管理的作法都是相當粗糙而容易被破解的。

藉由將系統帳號驗證(Authentication)分離開來,除了各個系統間帳號可以互通有無,更可以針對安全性部份做統一加強,例如在 傳遞帳號及密碼時採用SSL加密;進而形成帳號驗證伺服器(Authentication Server)的概念,將組織帳號予以集中管理,各個系統再透過帳號驗證伺服器(Authentication Server)進行認證。

在本文中我們會分享如何實作MediaWiki的帳號介面,藉由將帳號驗證部份抽離出來可讓MediaWiki以與其他的系統進行整合。

步驟一:瞭解帳號驗證介面AuthPlugin.php

在MediaWiki當中要抽換原本的帳號驗證程式必須要實作MediaWiki所提供的帳號驗證介面,此介面在MediaWiki安裝路徑下的includes目錄,其下的AuthPlugin.php檔案;以筆者在Linux環境下完整的路徑名稱是:

 
 /opt/lampp/htdocs/wiki/includes/AuthPlugin.php

筆者以表格方式來說明介面函式的用途:

函式名稱 說明
userExists( $username ) 檢查某位使用者是否存在。
authenticate( $username, $password ) 驗證使用者的帳號及密碼是否正確。
modifyUITemplate( &$template ) 在此函式中可更改使用者登入畫面。
setDomain( $domain ) 設定帳號所屬網域,帳號驗證撰寫者可依據使用者所選擇之網域將不同組織的帳號驗證加以區隔。
validDomain( $domain ) 驗證傳入的網域名稱是否為合法的。
updateUser( &$user ) &$user為使用者物件,在使用者在偏好設定中更新個人資訊時,按下儲存將使用者資訊存到此物件,在此函式中帳號驗證撰寫者可覆寫使用者的設定。
autoCreate() 是否要MediaWiki自動幫忙在其本身資料庫中建立對應的帳號,建立設為true,因為MediaWiki即使用外部驗證也必須在本身資料庫中建立對應的帳號。
allowPasswordChange() 是否允許使用者更改密碼。
setPassword( $user, $password ) 設定使用者密碼。
updateExternalDB( $user ) &$user為使用者物件,可根據此物件傳入資訊來更新實際存放的使用者資訊;此函式與updateUser函式搭配使用,updateUser先執行。
canCreateAccounts() 是否允許使用者自行建立帳號。
addUser( $user, $password, $email='', $realname='' ) 新增使用者,傳入在MediaWiki介面上使用者所輸入的相關資訊,在此函式中帳號驗證撰寫者可依據此資訊自行撰寫如何新增使用者的程式碼;此函式與initUser函式一起搭配使用,initUser先執行。
strict() 是否為嚴格帳號驗證模式,若為false則當外部驗證沒有通過時,會再用MediaWiki本身的資料庫資訊來進行驗證。
initUser( &$user ) &$user初始化使用者資訊,在建立帳號時傳入使用者填寫得相關資訊,帳號驗證撰寫者可在此修改使用者資訊。
getCanonicalName( $username ) 使用者在登入時輸入的使用者帳號,在此函式中可針對此帳號進行修改,例如都修改成小寫以方便後續的使用,在修改後後續的&$user帳號也會以此為準。

步驟二:實作帳號驗證介面

在實作部份筆者提供一個最簡單的實作程式碼給讀者參考,只有實作userExists及authenticate函式,由外部資料庫提供驗證,使用此程式碼的步驟如下:

  1. 下列程式碼中請將yourdatabasename改您自行建立的資料庫名稱。
  2. 在mysql_connect函式也請提供您本身的MySQL帳號及密碼。
  3. 在您資料庫中建立名為users的表格裡面有username及password欄位,型態皆為文字。
  4. 將程式碼另存為IntelliAuthenticationPlugin.php,可存放於MediaWiki的extension目錄下。

本程式只為表達實作MediaWiki帳號驗證介面之用,您可依需求改成更嚴謹之程式,並且逐漸加上其它函式,例如新增使用者及網域的支援。

 
<?php
require_once( 'AuthPlugin.php' );
require_once('DB.php');
 
 
class IntelliAuthenticationPlugin extends AuthPlugin {
 
function userExists( $username ) {
 
 
$connection = mysql_connect("localhost","","");
 
mysql_select_db("yourdatabasename", $connection);
 
 
$sql = "SELECT count(*) as usercount FROM users WHERE username='{$username}'";
 
 
$result = mysql_query($sql,$connection);
 
if (!($result = @ mysql_query ($sql, $connection)))
{
mysql_select_db("yourdatabasename", $connection);
return false;
}
else
{
 
mysql_select_db("yourdatabasename", $connection);
 
 
$row = mysql_fetch_array($result,MYSQL_NUM);
 
 
if ($row[0]>0)
return true;
else
return false;
}
 
}
 
 
function authenticate( $username, $password ) {
 
 
$connection = mysql_connect("localhost","","");
 
mysql_select_db("yourdatabasename", $connection);
 
 
$sql = "SELECT count(*) as usercount FROM users WHERE username='{$username}' and password='{$password}'";
 
 
$result = mysql_query($sql,$connection);
 
if (!($result = @ mysql_query ($sql, $connection)))
{
mysql_select_db("yourdatabasename", $connection);
return false;
}
else
{
 
mysql_select_db("yourdatabasename", $connection);
 
 
$row = mysql_fetch_array($result,MYSQL_NUM);
 
 
if ($row[0]>0)
return true;
else
return false;
}
}
 
function modifyUITemplate( &$template ) {
 
# Override this!
 
global $wgDomainNames;
 
$template->set( 'create', false );
 
 
//在建立新帳號時是否要讓使用者填寫email
$template->set( 'useemail', false );
}
 
function setDomain( $domain ) {
 
}
 
function validDomain( $domain ) {
 
}
 
function updateUser( &$user ) {
 
return true;
}
 
function autoCreate() {
 
return true;
}
 
function allowPasswordChange() {
 
return false;
}
 
function setPassword( $user, $password ) {
 
return true;
}
 
function updateExternalDB( $user ) {
 
return true;
}
 
function canCreateAccounts() {
return false;
}
 
function addUser( $user, $password, $email='', $realname='' ) {
return true;
}
 
 
function strict() {
 
return true;
}
 
function initUser( &$user ) {
 
 
}
 
function getCanonicalName( $username ) {
 
return $username;
}
}

步驟三:更改設定檔帳號驗證程式

在撰寫好帳號驗證程式後,需要告訴MediaWiki將原本的帳號驗證程式改為我們自行撰寫的,在MediaWiki的設定檔案LocalSettings.php加上以下的設定來引用自行撰寫的帳號驗證程式。

 
 include_once( 'extensions/IntelliAuthentication.php' );
$wgAuth = new IntelliAuthenticationPlugin();

結語

在完成以上步驟後再登入MediaWiki時就會採用新的帳號驗證程式,若將MediaWiki用在組織知識管理上,此帳號整合功能就會相當有用;讀者若想參考更複雜的範例可以參考Extension:LDAP Authentication這個外掛。

Comments