XPressME Integration Kit

Codex

ログイン時の権限設定

XPressMEのユーザー認証

XPressMEのユーザー認証はKtai StyleなどのWordPressプラグインによるWordPressにログインを可能にするため、XOOPSのユーザー認証ではなくWordPress側のユーザデータベースに基づく認証を行うようにしています。
XOOPSにログインしているユーザがXPressMEモジュールにアクセスしてきた場合、XPressMEはそのユーザ情報をXOOPSシステムから取得し、WordPressへのログインを行います。この時、WordPress側に該当ユーザが登録されていなければ、XPressMEはXOOPSユーザー情報をWordPressユーザーデータベースに登録します。これをXPressMEユーザー同期と呼んでいます。

XPressME ユーザ同期

XPressME-Ver1.Xでは、WordPress側からのユーザ登録・変更には制限がありましたがXPressME2.X以降ではこの制限をなくしました。
制限をかける場合は、WordPress側のコードを修正しなければならないので、WordPressの自動更新に対応できなくなるためです。(本当は面倒なだけ?)

ログイン時の権限設定

XPressMEではXPressMEへのモジュールアクセス権限をもつXOOPSのグループそれぞれに対して、WordPressの権限を指定することが出来ます。

XPressMEのユーザ同期設定は WordPress管理画面「設定」「XPressME設定」で行います。
ログイン時の権限設定では、XOOPSにログインしたユーザがXPressMEモジュールにアクセスしてきたときに、XPressMEがどう振舞うかを指定します。
ユーザは所属するXOOPSグループに割り当てられた権限が割り当てられます。(複数のグループに所属している場合は、最も高いレベルの権限が割り当てられます。)

「ログイン時、常に権限を更新する」にチェックがある場合は、ログインするたびに、設定された権限に更新されます。
これがどういうことを示すかというと、WordPress側で該当ユーザの権限を変更しても、ログイン毎にここでの設定値に戻されるということです。
簡単に言うとWordPress側での権限変更は無効ということです。

「ログイン時、常に権限を更新する」にチェックが無い場合は、XOOPSユーザが初めてXPressMEモジュールにアクセスしてきたときに、設定されている権限で、WordPressユーザとして登録されますが、その後管理者により、WordPress側で権限を変更することが出来ます。

xpress_role_set

注意

XOOPSのモジュールアクセス権限でXPressMEへのアクセス権限がないXOOPSグループはリストされません。

WordPress側でユーザー登録した場合

WordPress側でユーザを登録した場合、ユーザーがXOOPS側に登録されていない場合は、XOOPSの「登録ユーザ」グループに属するユーザとして新規登録されます。
既に登録されているユーザの場合は、更新処理が行われるだけで、所属グループは変更されません。

備考

WordPress側からのユーザ情報、追加・更新を可能にした場合の問題点として、
XOOPS側のパスワードがMD5化されているにもかかわらず、WordPress2.5以降ではMD5からよりセキュリティーの高いPHPassに変更になっていることが上げられます。
通常XOOPSやWordPressは入力されたパスワードをハッシュ化したものと、データベース上のパスワード(ハッシュ済み)を比較することで認証を行います。

ここでXOOPS上でログイン済みのユーザをWordPressユーザとして認証を行う場合はハッシュ値どうしの比較で認証します。(これはwp_check_password()をオーバーライドさせることで実現しています)
しかし、WordPress側からパスワードを変更した場合、PHPassで作成されるパスワードが、作られることになります。
そして、ユーザデータを同期するためにPHPassで作成されたパスワードが、XOOPS側のユーザデータに書き込まれることになります。
結果として、XOOPSユーザはログイン作業を行っても、MD5でハッシュされたパスワードと、PHPassでハッシュされたパスワードが異なりログインできなくなってしまうのです。
(ハッシュ値からパスワードを作り直せないのか? これが出来たらハッシュの意味がなくなります)

これらの理由からXPressMEでは、WordPress2.5以降のWordpressであっても、WordPress2.5以前のMD5ハッシュを使用するようにしています。
(wp_check_password()とwp_hash_password()をオーバーライドすることにより実現しています)