#author("2022-03-18T23:58:02+09:00","","")
#author("2022-03-20T16:39:07+09:00","","")
外部認証の設定の解説です。


* 外部認証とは [#k61b3760]

- 認証情報の入力・ユーザーアカウントの管理をPukiWiki外のシステムに移譲する認証方式です。
- Single Sign Onシステムと連携するために利用できます。
- Digest認証やSNS連携ログインなど、PukiWiki本体が対応していない認証を利用することも可能です。


外部認証は PukiWiki 1.5.1 以降で利用可能です。

* 仕組み [#x8b619b1]

- 認証が必要なタイミングで、設置したPukiWikiと同じサーバー内にある、PHPページ(以下、認証PHPページと呼びます)へリダイレクトが行われます。
- 認証PHPページで認証を行います。
- 認証PHP内のロジックで、SESSION['authenticated_user'] に認証に成功したユーザー名を格納します。
- 認証PHPには login_after というパラメータでログイン後のURLが指定されているので、このURLへリダイレクトを行います。
- 『SESSION['authenticated_user'] にユーザー名が格納されていること』を以って、PukiWiki側では認証を通過したものとして扱います。

* pukiwiki.ini.php 設定 [#hc9dfb11]

 $auth_type = AUTH_TYPE_EXTERNAL;
 $auth_external_login_url_base = './login/extlogin.php'

- $auth_type
-- 外部認証の場合、 AUTH_TYPE_EXTERNAL
- $auth_external_url_base
-- 実際の認証を行うPHPページのURL

** LDAP設定 (任意) [#g81ab11c]

 $ldap_user_account = 1;
 $ldap_server = 'ldap://ldapserver:389';
 $ldap_base_dn = 'ou=Users,dc=ldap,dc=example,dc=com';
 $ldap_bind_dn = 'uid=user_for_bind,dc=example,dc=com';
 $ldap_bind_password = 'xxxx';

外部認証で認証したユーザー名から、LDAP経由で情報を取得する際にはLDAPの設定を行います。詳細は [[../LDAP]] を参照してください。
不要な場合、 $ldap_user_account = 0; に設定します。

PukiWikiが取得・利用する属性は以下の通りです

- 認証ユーザーの Full name (ページ編集時に記録される)
- 認証ユーザーが属しているグループ (ページアクセス制御に利用される)


** read/edit/search設定 [#zb3f3859]

閲覧制限:

 $read_auth = 1;

編集制限:

 $edit_auth = 1;

検索制限:
 $search_auth = 1;

* グループ [#w28968c0]

** 定義済みグループ [#mb14d096]

- valid_user: 認証を通ったユーザーすべてが属しているグループ

** PukiWiki内グループ [#qbda94c3]

- $auth_groups で外部認証ユーザーを含むグループを定義できます。
 $auth_groups = array(
   'group_1' => 'ext_user_a,ext_user_b,ext_user_c',
 );

** LDAPグループ [#mc544853]

- $ldap_user_account が 1 の場合、LDAP経由で取得したグループを利用できます

- 'ldap:group_a' 'ldap:group_b' 等

** 認証PHPページ [#l79718a9]

認証PHPページはPukiWiki配布パッケージには含まれていません。各動作環境に合わせて作成する必要があります。

- 入力パラメータ - url_after_login
-- 認証完了後、リダイレクトするPukiWiki内URL
- 動作
-- ページ内で認証を行い、認証を通過した場合、セッション $_SESSION['authenticated_user'] にユーザー名を格納し、url_after_login にリダイレクトする。

*** 認証PHPページ - サンプル [#y9868abb]

環境変数 REMOTE_USER を認証ユーザーとする認証PHP


login/exlogin.php :
 <?php
 ini_set('session.use_strict_mode', 1);
 ini_set('session.use_cookies', 1);
 ini_set('session.use_only_cookies', 1);
 mb_internal_encoding('UTF-8');
 mb_http_input('pass');
 mb_http_output('pass');
 
 $url_after_login = filter_input(INPUT_GET, 'url_after_login');
 $url_after_login_html = htmlspecialchars($url_after_login);
 $page = filter_input(INPUT_GET, 'page');
 
 session_start();
 session_regenerate_id();
 $user = filter_input(INPUT_SERVER, 'REMOTE_USER');
 $_SESSION['authenticated_user'] = $user;
 
 define('URL_PREFIX', 'http://pukiwiki.example.com/'); //★必ず編集すること - 対象PukiWikiサイトのドメイン OpenRedirect防止
 if (substr($url_after_login, 0, strlen(URL_PREFIX)) === URL_PREFIX) {
    header('HTTP/1.0 302 Found');
    header('Location: ' . $url_after_login);
 }
 ?>
 <html>
    <head>
        <meta charset="utf-8">
        <title>External login</title>
    </head>
    <body>
        user: <b><?php echo htmlspecialchars($user) ?></b><br>
        page: <?php echo htmlspecialchars($page) ?><br>
        url_after_login: <a href="<?php echo $url_after_login_html ?>"><?php echo $url_after_login_html ?></a><br>
    </body>
 </html>



----
- 「ユーザー登録システムの実装案 (はいふん)」はいふんさん、実装提案ありがとうございます。この件PukiWiki本体に組み込むのは少し難しい面があって、 userlist.dat はユーザーから絶対にアクセスできてはいけないのです。今の実装そのままだと、 /userist.dat を変更可能にする必要がありますし、Webサーバーの権限設定に気を付けないとWebからでもアクセス・ダウンロードできてしまいます。このようなファイルを置ける丁度いい場所があるかというとあまりなく、 wiki/ diff/ attach/ 等は配置するファイルが決まっていますし、 cache/ は比較的自由ですが、永続化するようなファイルを置くのには適切ではありません。 (その名の通り cache なので途中で消えても復元できるようなファイルを置くべき) このあたりを考えると、(Form自体は PukiWiki plugin の仕組みで用意してもいいのですが) userlist.dat はpukiWikiと無関係に、例えば DocumentRoot と違う場所に置くようにして外部認証 [[pukiwiki:PukiWiki/Authentication/ExternalAuth]] として連携するのがいいんじゃないかな、と思っています。 -- [[umorigu]] &new{2022-03-18 (金) 23:58:02};

#comment

トップ   編集 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Site admin: PukiWiki Development Team

PukiWiki 1.5.4+ © 2001-2022 PukiWiki Development Team. Powered by PHP 5.6.40-0+deb8u12. HTML convert time: 0.035 sec.

OSDN