パスワードの変更を設定してあるユーザの一覧表示

パスワードの変更を設定してあるユーザの一覧表示

- Tatsuya Shirai の投稿
返信数: 5

 手動アカウントの作成でユーザ登録する際に,仮パスワードを設定して,ログイン時に変更させる設定にすることが多々あります.ところがなかなかログインしてくれない学生も居たりする.仮パスワードを難しく設定しすぎるとログインに失敗するので,非常に簡単なルール(たとえばアカウントと同一や苗字のローマ字表記など)を採用している場合は,そういうアカウントをいつまでも放置しておくと”なりすまし”の被害が生じる恐れがある.

 ユーザの一覧表示の条件に,パスワードの変更のフラグがOnになっているユーザを抽出するフィルタを追加したい.既に実装済みの方,いらしたらパッチを提供して頂けないでしょうか?


正確には「パスワード変更の強制」で,preference_auth_forcepasswordchangeがキーワードですね.手動アカウントの入力以外の場合もチェックはOnにできるようです(CAS, LDAPなど).

Tatsuya Shirai への返信

Re: パスワードの変更を設定してあるユーザの一覧表示

- Tatsuya Shirai の投稿

ソースリストから辿っていったら,少し見えてきましたね.

mdl_user_preferencesの中から,auth_forcepasswordchangeが1のuseridを抽出すれば良さそうだ.あとはこれをどうフィルタとして組み込むか,ですね.

Tatsuya Shirai への返信

Re: パスワードの変更を設定してあるユーザの一覧表示

- Tatsuya Shirai の投稿

 フィルターのプログラムを追加する必要がありましたが,courserole.phpとyesno.phpとsimpleselect.phpを参考にして何とか作成できました.一応,mdl_user_preferencesに格納されているユーザ設定をセレクタで値を選択して(さらに特化したyes/noのインタフェースを介して)”パスワード変更の強制”のYes/No(Noにはあまり意味が無い)を拡張条件に追加できるようになりました.

 これでウッカリ者や横着者を見つけ出して注意するのが容易になりました.

添付 Shirai132A.jpg
Tatsuya Shirai への返信

Re: パスワードの変更を設定してあるユーザの一覧表示

- Tatsuya Shirai の投稿

 ソースの修正はuser/filters/lib.phpのみ.それと貼付したzip書庫内の二つのフィルタープログラムであるuser_preferences.php / user_preferences_yesno.phpをuser/filtersフォルダに格納して下さい.

 なお,このフィルターによるユーザの検索はMoodle1.9以降でのみ実装された機能ですので,この改良もMoodle1.9向けです.Moodle1.8では動作しません.


(a) 冒頭

require_once($CFG->dirroot.'/user/filters/yesno.php');
require_once($CFG->dirroot.'/user/filters/user_filter_forms.php');
// (Shirai132): ここから追加
require_once($CFG->dirroot.'/user/filters/user_preferences.php');
require_once($CFG->dirroot.'/user/filters/user_preferences_yesno.php');
// (Shirai132): ここまで追加

(b) function user_filtering()

        if (empty($fieldnames)) {
            $fieldnames = array('realname'=>0, 'lastname'=>1, 'firstname'=>1, 'email'=>1, 'city'=>1, 'country'=>1,
                                'confirmed'=>1, 'profile'=>1, 'courserole'=>1, 'systemrole'=>1,
// (Shirai132): ここから修正
//
                              'firstaccess'=>1, 'lastaccess'=>1, 'lastlogin'=>1, 'username'=>1, 'auth'=>1, 'mnethostid'=>1);
                                'firstaccess'=>1, 'lastaccess'=>1, 'lastlogin'=>1, 'username'=>1, 'auth'=>1, 'mnethostid'=>1, 'forcepasswordchange'=>1);
// (Shirai132): ここまで修正
        }

(c) function get_field(), switch-case文の最後に追加


                if (count($choices) < 2) {
                    return null; // filter not needed
                }
                return new user_filter_simpleselect('mnethostid', 'mnethostid', $advanced, 'mnethostid', $choices);

// (Shirai132): ここから追加
            case 'forcepasswordchange':   return new user_filter_user_preferences_yesno('forcepasswordchange', get_string('forcepasswordchange'), $advanced, 'auth_forcepasswordchange');
// (Shirai132): ここまで追加
            default:            return null;
        }
    }


修正は以上です.意外と少ないですね.(a)はフィルタ本体の読み込み,(b)はこの追加したフィルタが拡張要素であることを示しており,実際の呼び出しは(c)の1箇所だけで,あとはフィルタプログラムがプラグインとして動作します.多分,大丈夫だと思うのですが,見よう見まねですので...

評点平均: お役立ち度: ★★★★★★★ (1)
Tatsuya Shirai への返信

Re: パスワードの変更を設定してあるユーザの一覧表示

- Tatsuya Shirai の投稿

なお,この改良を行って発見した小ネタを一つ.

 標準のフィルタとして表示されるのは”名称(realname)”のみです.それ以外の項目はいちいち”拡張要素を表示する”を押して表示しないとならない.もし常用するフィルタがあって,この操作が億劫な場合は,user/filters/lib.phpのclass user_filtering,function user_filtering()の冒頭,

        if (empty($fieldnames)) {
            $fieldnames = array('realname'=>0, 'lastname'=>1, 'firstname'=>1, 'email'=>1, 'city'=>1, 'country'=>1,
                                'confirmed'=>1, 'profile'=>1, 'courserole'=>1, 'systemrole'=>1,
                                'firstaccess'=>1, 'lastaccess'=>1, 'lastlogin'=>1, 'username'=>1, 'auth'=>1, 'mnethostid'=>1);
        }

この1を0に変えれば拡張要素ではなく基本要素として常に画面に表示されるようになる.もしオリジナルにあまり手を加えたく無く,修正を明示したいのであればif文のブロック中({と}の間)で,

            $fieldnames['email'] = 0;

のように設定値を書き換えてもOKです.

#当然ながら,これもMoodle1.9以降でのみ有効なテクニックです.


ですので,先ほどのパッチの(b)の修正箇所も,

(b) function user_filtering()

        if (empty($fieldnames)) {
            $fieldnames = array('realname'=>0, 'lastname'=>1, 'firstname'=>1, 'email'=>1, 'city'=>1, 'country'=>1,
                                'confirmed'=>1, 'profile'=>1, 'courserole'=>1, 'systemrole'=>1,
// (Shirai132): ここから修正
//
                              'firstaccess'=>1, 'lastaccess'=>1, 'lastlogin'=>1, 'username'=>1, 'auth'=>1, 'mnethostid'=>1);
                                'firstaccess'=>1, 'lastaccess'=>1, 'lastlogin'=>1, 'username'=>1, 'auth'=>1, 'mnethostid'=>1, 'forcepasswordchange'=>1);
// (Shirai132): ここまで修正
        }

ではなく,

        if (empty($fieldnames)) {
            $fieldnames = array('realname'=>0, 'lastname'=>1, 'firstname'=>1, 'email'=>1, 'city'=>1, 'country'=>1,
                                'confirmed'=>1, 'profile'=>1, 'courserole'=>1, 'systemrole'=>1,
                                'firstaccess'=>1, 'lastaccess'=>1, 'lastlogin'=>1, 'username'=>1, 'auth'=>1, 'mnethostid'=>1);
// (Shirai132): ここから追加
            $fieldnames['forcepasswordchange'] = 1;
// (Shirai132): ここまで追加

        }

とした方がスマートでした.

評点平均: お役立ち度: ★★★★★★★ (1)
Tatsuya Shirai への返信

Re: パスワードの変更を設定してあるユーザの一覧表示

- Tatsuya Shirai の投稿

お久し振りです.

ようやく戻って来ました^^;

さて,本改良,ユーザー登録時期の4月には結構,便利な機能だったと思いますが,Moodle1.9の頃のコードではダメです.Moodle2.8のみの検証ですが,以下のように改良することで,再び使えるようになりました.

http://www.suzuka-ct.ac.jp/mech/moodle2/mod/wiki/view.php?pageid=3000

user/filters/lib..php に以下の改造を行い,更にuser/filtersフォルダに添付のuser_preferences_yesno.phpを追加して下さい.

(1) 冒頭

require_once($CFG->dirroot.'/user/filters/cohort.php');
require_once($CFG->dirroot.'/user/filters/user_filter_forms.php');
require_once($CFG->dirroot.'/user/filters/checkbox.php');
// (Shirai025): パスワード変更の強制がOnのままのユーザを発見するためのフィルタをユーザリストの表示に追加 (2009/05/08)(2015/05/09)
// (Shirai025): ここから追加
require_once($CFG->dirroot.'/user/filters/user_preferences_yesno.php');
// (Shirai025): ここまで追加
/**
 * User filtering wrapper class.

(2) function user_filtering()

        if (empty($fieldnames)) {
            $fieldnames = array('realname' => 0, 'lastname' => 1, 'firstname' => 1, 'username' => 1, 'email' => 1, 'city' => 1, 'country' => 1,
                                'confirmed' => 1, 'suspended' => 1, 'profile' => 1, 'courserole' => 1, 'systemrole' => 1,
                                'cohort' => 1, 'firstaccess' => 1, 'lastaccess' => 1, 'neveraccessed' => 1, 'timemodified' => 1,
                                'nevermodified' => 1, 'auth' => 1, 'mnethostid' => 1);
// (Shirai132): パスワード変更の強制がOnのままのユーザを発見するためのフィルタをユーザリストの表示に追加 (2009/05/08)
// (Shirai132): ここから追加
            $fieldnames['forcepasswordchange'] = 1;
// (Shirai132): ここまで追加
        }

(3) function get_field()

            case 'confirmed':   return new user_filter_yesno('confirmed', get_string('confirmed', 'admin'), $advanced, 'confirmed');
            case 'suspended':   return new user_filter_yesno('suspended', get_string('suspended', 'auth'), $advanced, 'suspended');
// (Shirai025): パスワード変更の強制がOnのままのユーザを発見するためのフィルタをユーザリストの表示に追加 (2009/05/08)
// (Shirai025): ここから追加
            case 'forcepasswordchange':   return new user_filter_user_preferences_yesno('forcepasswordchange', get_string('forcepasswordchange'), $advanced, 'auth_forcepasswordchange');
// (Shirai025): ここまで追加
            case 'profile':     return new user_filter_profilefield('profile', get_string('profilefields', 'admin'), $advanced);