残念ですが、「新規アカウント作成を学内のプライベートアドレスのクライアントのみとする」設定はできないようです。
新規アカウント作成用のプログラム (login/signup.php) を修正することで、ご希望の動作を実現することができます。具体的には、下記のような修正により、Moodleのバージョンアップに対しても影響が少ないと思います。
ご参考までに。
1. Moodleの設定ファイルconfig.phpにサブネットとIPアドレスを記述する。
$CFG->subnet = '192.168.0.1/30, xxx.xxx.xxx.xxx';
2. 登録者のIPアドレスによりユーザ登録可否を判断する。
なるほど!これは考えもしなかったことですが,セキュリティポリシー上は非常に重要な話ですね.
2に関して(login/signup.phpの冒頭)ですが,例えば以下のような感じで良いですよね.
require_once('signup_form.php');
if (empty($CFG->registerauth)) {
error("Sorry, you may not use this page.");
}
// ここから追加
if (isset($CFG->subnet)) {
if (!address_in_subnet(getremoteaddr(), $CFG->subnet)) {
error("Sorry, you may not use this page.");
}
}
// ここまで追加
$authplugin = get_auth_plugin($CFG->registerauth);
if (!$authplugin->can_signup()) {
error("Sorry, you may not use this page.");
}
$CFG->subnetというのはMoodle中では使用されていない新規の変数ですね.
ちょっと実験してみた感じではOKそうです.
実は当初,クライアントPCのIPアドレスを取得するのに,$_SERVER['REMOTE_ADDR']を試みたのですが,NGでした.多くの場合はOKなのかも知れませんが,本校の場合はProxyサーバを介してWebページが公開され,外部からアクセスする場合もこのサーバ(と別のサーバ)を介してアクセスします.つまり学外からも学内からも,Moodleのサイトから見ると区別がつかない.getremoteaddr()関数を使うことで,学外と学内の区別がつくようになりました.
getremoteaddr()関数はlib/moodlelib.phpの中で宣言されていますが,他の2つのサーバ変数をチェックすることで,なるべくオリジナルに近いIPアドレスを返すようになっていました.ログに記録を残すadd_to_log()関数でも使われています.
なお,あまりサブネットアドレスの設定をよく理解できていないのですが,
function address_in_subnet()のコメントを見ると,
* The parameter is a comma separated string of subnet definitions.
* Subnet strings can be in one of three formats:
* 1: xxx.xxx.xxx.xxx/xx
* 2: xxx.xxx
* 3: xxx.xxx.xxx.xxx-xxx //a range of IP addresses in the last group.
このようになっています.
本校のIPアドレスは172.16.*.*です.タイプ1の形式で,
$CFG->subnet = '172.16.x.y/16';
としました.x, yは実際にはMoodleサイトのIPアドレスです.同じ学内からProxyを介して学内のMoodleサイトにアクセスした場合は,172.16.a.bのようなProxyサーバのアドレスでアクセスしたことになります.学内のどのPCからアクセスしても,aとbの値は同じ値です.つまり下16bitは仲間だぞ,そういう意味の設定であると考えて良いのですよね?
はい、素晴らしいです。
エラーメッセージの部分は、下記のようにja_utf8/error.phpの「 $string['cannotusepage2'] = '申し訳ございません、あなたはこのページを使用できません。'; 」を使っても良いですね。
// ここから追加
if (isset($CFG->subnet)) {
// ここまで追加