ldap(ActiveDirectory)と認証連携について

ldap(ActiveDirectory)と認証連携について

- Yuuichi Yamaguchi の投稿
返信数: 14

今年度から、moodleの小テスト機能だけを
私の勤務する高等学校の情報Cの授業で、
利用することになりました。
ユーザの管理は、WindowsServer2003で行っているので
moodleへのログインは、ldap認証を利用しようと思っています。
moodleのオンラインマニュアルを読みながら、
ldap認証の設定を進めて、
WindowsServer2003にあるActiveDirectory内の
ユーザ名とパスワードを使ってmoodleにログインできるようになりました。
しかし、初めてログインすると、必ず
「プロフィールの編集」画面となってしまいます。

ここで必須入力項目となっているのが
・名
・姓
・メールアドレス
・都道府県
・国
・自己紹介
となっております。
本校での運用としましては、
メールアドレスを生徒に付与していないため、
このメールアドレスの登録を必須にしたくないのですが、
それは可能でしょうか?
また、都道府県、国および自己紹介も
必須にしたくないのですが、それは可能でしょうか?

つまり、
「メールアドレス」
「都道府県」
「国」
「自己紹介」
の4つの要素を未入力でも、プロフィールを
登録できる状態にしたいと考えております。

評点平均:有益(Useful) (1)
Yuuichi Yamaguchi への返信

Re: ldap(ActiveDirectory)と認証連携について

- Mitsuhiro Yoshida の投稿
画像 Developers 画像 Particularly helpful Moodlers 画像 Translators
> 「メールアドレス」
> 「都道府県」
> 「国」
> 「自己紹介」
> の4つの要素を未入力でも、プロフィールを登録できる状態にしたいと考えております。

下記プログラムの修正で、「4つの要素を未入力でも、プロフィールを登録できる状態」になります。
お試しください。笑顔

Moodleのバージョン: Moodle 1.8.4+
修正プログラム: user/edilib.php
修正箇所: 71行目
[ 変更前 ]
$mform->addRule('email', $strrequired, 'required', null, 'client');

[ 変更後 ]
// $mform->addRule('email', $strrequired, 'required', null, 'client');

修正箇所: 160行目
[ 変更前 ]
$mform->addRule('city', $strrequired, 'required', null, 'client');

[ 変更後 ]
// $mform->addRule('city', $strrequired, 'required', null, 'client');

修正箇所: 166行目
[ 変更前 ]
$mform->addRule('country', $strrequired, 'required', null, 'client');

[ 変更後 ]
// $mform->addRule('country', $strrequired, 'required', null, 'client');


修正プログラム: user/editadvanced_form.php
修正箇所: 137行目
[ 変更前 ]
if (!$user or $user->email !== $usernew->email) {
if (!validate_email($usernew->email)) {
$err['email'] = get_string('invalidemail');
} else if (record_exists('user', 'email', $usernew->email, 'mnethostid', $CFG->mnet_localhost_id)) {
$err['email'] = get_string('emailexists');
}
}

[ 変更後 ]
if (!$user or $user->email !== $usernew->email) {
if (!validate_email($usernew->email)) {
// $err['email'] = get_string('invalidemail');
} else if (record_exists('user', 'email', $usernew->email, 'mnethostid', $CFG->mnet_localhost_id)) {
$err['email'] = get_string('emailexists');
}
}





Mitsuhiro Yoshida への返信

Re: ldap(ActiveDirectory)と認証連携について

- Yuuichi Yamaguchi の投稿

ありがとうございます。ご指示いただいた箇所を書き換えました。
これにより、「プロフィールの編集」画面で、
・名
・姓
・自己紹介
だけが、赤文字の*付になりました。
そして、
・名
・姓
だけを入力して、「プロフィールの更新」をクリックすると、
・メールアドレスの項目が赤枠でくくられて、その中に
 「不正なメールアドレスです。」という赤文字が現れました。
・自己紹介の項目が赤枠でくくられて、その中に
 「必須」という赤文字が現れました。

他に変更すべき箇所を教えていただけないでしょうか?

Yuuichi Yamaguchi への返信

Re: ldap(ActiveDirectory)と認証連携について

- Mitsuhiro Yoshida の投稿
画像 Developers 画像 Particularly helpful Moodlers 画像 Translators
> 他に変更すべき箇所を教えていただけないでしょうか?

大変失礼致しました。赤面
恐らく下記修正で大丈夫だと思います。
よろしければ、お試しください。

Moodleのバージョン: Moodle 1.8.4+
修正プログラム: user/moodlelib.php
修正プログラム: lib/moodlelib.php
修正箇所: 28行目
[ 変更前 ]
function user_not_fully_set_up($user) {
return ($user->username != 'guest' and (empty($user->firstname) or empty($user->lastname) or empty($user->email) or over_bounce_threshold($user)));
}

[ 変更後 ]
function user_not_fully_set_up($user) {
// return ($user->username != 'guest' and (empty($user->firstname) or empty($user->lastname) or empty($user->email) or over_bounce_threshold($user)));
return ($user->username != 'guest' and (empty($user->firstname) or empty($user->lastname) or over_bounce_threshold($user)));
}

修正プログラム: user/edilib.php
修正箇所: 71行目
[ 変更前 ]
$mform->addRule('email', $strrequired, 'required', null, 'client');

[ 変更後 ]
// $mform->addRule('email', $strrequired, 'required', null, 'client');

修正箇所: 160行目
[ 変更前 ]
$mform->addRule('city', $strrequired, 'required', null, 'client');

[ 変更後 ]
// $mform->addRule('city', $strrequired, 'required', null, 'client');

修正箇所: 166行目
[ 変更前 ]
$mform->addRule('country', $strrequired, 'required', null, 'client');

[ 変更後 ]
// $mform->addRule('country', $strrequired, 'required', null, 'client');


修正プログラム: user/edit_form.php
修正箇所: 28行目
[ 変更前 ]
/// extra settigs
$mform->addRule('description', $strrequired, 'required', null, 'client');

[ 変更後 ]
/// extra settigs
// $mform->addRule('description', $strrequired, 'required', null, 'client');

修正箇所: 103行目
[ 変更前 ]
// validate email
if (!validate_email($usernew->email)) {
$err['email'] = get_string('invalidemail');
} else if (($usernew->email !== $user->email) and record_exists('user', 'email', $usernew->email, 'mnethostid', $CFG->mnet_localhost_id)) {
$err['email'] = get_string('emailexists');
}

[ 変更後 ]
// validate email
if (!validate_email($usernew->email)) {
// $err['email'] = get_string('invalidemail');
} else if (($usernew->email !== $user->email) and record_exists('user', 'email', $usernew->email, 'mnethostid', $CFG->mnet_localhost_id)) {
$err['email'] = get_string('emailexists');
}

修正プログラム: user/editadvanced_form.php
修正箇所: 137行目
[ 変更前 ]
if (!$user or $user->email !== $usernew->email) {
if (!validate_email($usernew->email)) {
$err['email'] = get_string('invalidemail');
} else if (record_exists('user', 'email', $usernew->email, 'mnethostid', $CFG->mnet_localhost_id)) {
$err['email'] = get_string('emailexists');
}
}

[ 変更後 ]
if (!$user or $user->email !== $usernew->email) {
if (!validate_email($usernew->email)) {
// $err['email'] = get_string('invalidemail');
} else if (record_exists('user', 'email', $usernew->email, 'mnethostid', $CFG->mnet_localhost_id)) {
$err['email'] = get_string('emailexists');
}
}
Mitsuhiro Yoshida への返信

Re: ldap(ActiveDirectory)と認証連携について

- Yuuichi Yamaguchi の投稿
ありがとうございます。

> 修正プログラム: user/moodlelib.php
このファイルが見つけられなかったのですが、

lib/moodlelib.php このファイルでしょうか?
Yuuichi Yamaguchi への返信

Re: ldap(ActiveDirectory)と認証連携について

- Mitsuhiro Yoshida の投稿
画像 Developers 画像 Particularly helpful Moodlers 画像 Translators
> lib/moodlelib.php このファイルでしょうか?

はい、そうです。
ご指摘のとおり、user/moodlelib.phpではなく、lib/moodlelib.phpです。
Mitsuhiro Yoshida への返信

Re: ldap(ActiveDirectory)と認証連携(パスワードの変更後について)

- Yuuichi Yamaguchi の投稿

ありがとうございます。無事に、「姓」と「名」だけで、「プロフィールの編集」を完了できるようになりました。

もうひとつ質問させてください。

このLDAP認証により、WindowsServer2003にログインするユーザで、moodleにログインできるようになりましたっが、WindowsServer2003(AD)へログインする生徒には定期的にパスワードを変更させる指導を行っています。

生徒用ユーザでWindowsServer2003(AD)へログインするパスワードを変更してから、もう一度、moodleに古いパスワードでログインしてみたら、ログインできてしまいました。とうぜん、この時にWindowsServer2003(AD)には古いパスワードではログインできません。しかし、新しいパスワードでも、moodleにログインできました。つまり、moodleには新しいパスワードと古いパスワードのどちらでも、ひとつのユーザがログインできる状態になってしまっています。

これを解決する方法はないでしょうか?

Yuuichi Yamaguchi への返信

Re: ldap(ActiveDirectory)と認証連携(パスワードの変更後について)

- Mitsuhiro Yoshida の投稿
画像 Developers 画像 Particularly helpful Moodlers 画像 Translators
>しかし、新しいパスワードでも、moodleにログインできました。つまり、moodleには新しいパスワードと古いパスワードのどちらでも、ひとつのユーザがログインできる状態になってしまっています。

> これを解決する方法はないでしょうか?

「サイト管理 > ユーザ > 認証 > LDAPサーバ」の「Bind設定」で「パスワードを隠す = Yes」にしてください。笑顔

Mitsuhiro Yoshida への返信

Re: ldap(ActiveDirectory)と認証連携(パスワードの変更後について)

- Yuuichi Yamaguchi の投稿

>> 「サイト管理 > ユーザ > 認証 > LDAPサーバ」の「Bind設定」で「パスワードを隠す = Yes」にしてください。

Yesになっています。

Yuuichi Yamaguchi への返信

Re: ldap(ActiveDirectory)と認証連携(パスワードの変更後について)

- Mitsuhiro Yoshida の投稿
画像 Developers 画像 Particularly helpful Moodlers 画像 Translators
大変お手数ですが、「今までLDAPサーバ認証でMoodleにログインしたことのないユーザ」を使用して、Moodleにログインしてください。
そのユーザのパスワードをLDAPサーバで変更した後、新しいパスワードおよび古いパスワードでMoodleに再度ログインできるかどうかご確認ください。

プログラムを調べましたところ、「サイト管理 > ユーザ > 認証 > LDAPサーバ」の「パスワードを隠す (preventpassindb)」がYesにされている場合、Moodleへの初回ログイン時、Moodle内に新たに作成されるユーザのパスワードには「not cached」が設定されるようです。

対象プログラム: lib/moodlelib.php
対象関数: authenticate_user_login()
対象箇所: 2716行目
} else {
// if user not found, create him
$user = create_user_record($username, $password, $auth);
}

対象プログラム: lib/moodlelib.php
対象関数: create_user_record()
対象箇所: 2573行目
if (insert_record('user', $newuser)) {
$user = get_complete_user_data('username', $newuser->username);
if(!empty($CFG->{'auth_'.$newuser->auth.'_forcechangepassword'})){
set_user_preference('auth_forcepasswordchange', 1, $user->id);
}
update_internal_user_password($user, $password);
return $user;

対象プログラム: lib/moodlelib.php
対象関数: update_internal_user_password()
対象箇所: 2822行目
$authplugin = get_auth_plugin($user->auth);
if (!empty($authplugin->config->preventpassindb)) {
$hashedpassword = 'not cached';
} else {
$hashedpassword = hash_internal_user_password($password);
}

Mitsuhiro Yoshida への返信

Re: ldap(ActiveDirectory)と認証連携(パスワードの変更後について)

- Yuuichi Yamaguchi の投稿

> 大変お手数ですが、「今までLDAPサーバ認証でMoodleにログインしたことのないユーザ」を使用して、Moodleにログインしてください。
> そのユーザのパスワードをLDAPサーバで変更した後、新しいパスワードおよび古いパスワードでMoodleに再度ログインできるかどうかご確認ください。

確認しましたら、新しいパスワードと古いパスワードどちらでも、Moodleに再度ログインできました。

 

> 「サイト管理 > ユーザ > 認証 > LDAPサーバ」の「パスワードを隠す (preventpassindb)」がYesにされている場合

Yesの状態で、確認しました。

 

> Moodleへの初回ログイン時、Moodle内に新たに作成されるユーザのパスワードには「not cached」が設定

not cachedということでしたら、二つのパスワードが使えないはずかな?と思いましたが、実際は使えてしまいました。

対象関数: authenticate_user_login()
対象箇所:
} else {

// if user not found, create him
$user = create_user_record($username, $password, $auth);

}
この対象箇所を確認しましたが、御表記いただいたままの状態でした。特にいじっていません。

対象プログラム: lib/moodlelib.php
対象関数: create_user_record()
対象箇所:
    if (insert_record('user', $newuser)) {
        $user = get_complete_user_data('username', $newuser->username);
        if(!empty($CFG->{'auth_'.$newuser->auth.'_forcechangepassword'})){
            set_user_preference('auth_forcepasswordchange', 1, $user->id);
        }
        update_internal_user_password($user, $password);
        return $user;
    }
    return false;
ここも確認しましたが、御表記いたたいたままの状態でした。特にいじっていません。

対象プログラム: lib/moodlelib.php
対象関数: update_internal_user_password()
対象箇所:
function update_internal_user_password(&$user, $password) {
    global $CFG;

    $authplugin = get_auth_plugin($user->auth);
    if (!empty($authplugin->config->preventpassindb)) {
        $hashedpassword = 'not cached';
    } else {
        $hashedpassword = hash_internal_user_password($password);
    }

    return set_field('user', 'password',  $hashedpassword, 'id', $user->id);
}
こちらの箇所も、御表記いたたいたままの状態でした。特にいじっていません。

Yuuichi Yamaguchi への返信

Re: ldap(ActiveDirectory)と認証連携(パスワードの変更後について)

- Mitsuhiro Yoshida の投稿
画像 Developers 画像 Particularly helpful Moodlers 画像 Translators
>確認しましたら、新しいパスワードと古いパスワードどちらでも、Moodleに再度ログインできました。

ご確認ありがとうございます。

パスワード (password) を含むユーザ情報は、「mdl_user」という名称のMySQLデータベースのテーブルに保存されています。
可能でしたら、phpMyAdmin等のMySQLデータベース管理プログラムを使って、2つのパスワードでログインできてしまうユーザのパスワード (password) の状態を確認して頂けませんでしょうか。

[phpMyAdmin - MySQL Database Administration Tool]
http://www.phpmyadmin.net/

添付 phpmyadmin.jpg
Mitsuhiro Yoshida への返信

Re: ldap(ActiveDirectory)と認証連携(パスワードの変更後について)

- Yuuichi Yamaguchi の投稿

mysql> select auth,username,password FROM mdl_user where username="31001";
+------+----------+------------+
| auth | username | password   |
+------+----------+------------+
| ldap | 31001    | not cached |
+------+----------+------------+
1 row in set (0.00 sec)

phpmyadminの使い方がよくわからないので、サーバで直接コマンドを打つことにより、2つのパスワードでログインできてしまうユーザのパスワード (password) の状態を上記のとおり、確認させていただきました。

Yuuichi Yamaguchi への返信

Re: ldap(ActiveDirectory)と認証連携(パスワードの変更後について)

- Mitsuhiro Yoshida の投稿
画像 Developers 画像 Particularly helpful Moodlers 画像 Translators
> phpmyadminの使い方がよくわからないので、サーバで直接コマンドを打つことにより、2つのパスワードでログインできてしまうユーザのパスワード (password) の状態を上記のとおり、確認させていただきました。

ご確認ありがとうございます。

パスワード (password) に「not cached」と設定されていますので、変更前後の2つのパスワードを入力したとしても、お使いのMoodle内部では「ユーザ31001のパスワードが違います」と判断していると思われます。

もしかしたら、ブラウザのキャッシュまたはLDAPサーバに何らかの原因があるかもしれません。