外部システムでユーザー認証した結果をPukiWikiのユーザーとして扱いたい†
- ページ: BugTrack2
- 投稿者: umorigu
- 優先順位: 低
- 状態: 完了
- カテゴリー: 本体新機能
- 投稿日: 2016-01-18 (月) 03:27:37
- バージョン: 1.5.0
- リリース予定バージョン: 1.5.1
メッセージ†
PukiWiki外部の認証システム(WebサーバーのBasic認証やSingle Sign Onシステム等)を利用することで、各ユーザーのパスワードなどの秘匿情報をPukiWikiの管理外にすることができる。
ただし、この場合、そのユーザー(ID)を使って、PukiWiki管理のページ単位のアクセス制御を行うことができない。
外部で認証に使ったユーザー名をPukiWiki利用時のユーザーとして利用したい。
外部認証連携するためのページ例†
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 ://localhost:8070/'); //★必ず編集すること - 対象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>
- $auth_type = AUTH_TYPE_EXTERNAL;
- pukiwiki.ini.php でこの exlogin.php のURL(相対パス)を指定すると、認証が必要なタイミングでこのURLにリダイレクトされる
- Webサーバーの設定で、認証が通った後にのみ、このページが表示されるようにしておく
- mylogin.php はリダイレクトを行うので、Open Redirecterにならないようにドメイン制限をしておく(URL_PREFIXがそれ)
この exlogin.php 自体は PukiWiki 配布ファイルに含まれない。
- pukiwiki:自作プラグイン/userauth.phpこんなのもありますよ。 -- _
- いちおう認証ユーザーの登録関連かな?BugTrack/776: 編集者登録と編集者別編集履歴表示機能 --
- 前半の外部認証は、ユーザー登録関連ではあるのですが、アカウント(ユーザー名とパスワード)の管理を完全にPukiWikiと切り離したいというモチベーションによるものです。例えば.htpassswdであったり、外部のLDAPサーバーであったりします。PukiWiki管理者からはコントロールできないもの、と言い換えることもできます -- umorigu
- こんにちは。セッションのまじめな実装と、ユーザー名に対する名前空間(複数種の認証システムを区別する仕組み)と、アカウントのキャッシュが欲しいのですか? -- henoheno
- 去年どこかに似たようなことをコメントしたような気がします -- henoheno
- 「セッションのまじめな実装」は必要だと考えています。「ユーザー名の名前空間」は意図していませんでした。認証システムはまずは単一のものとして対応しようとしています(将来の拡張は可能だと思います)。キャッシュは、、外部システムで認証を通ったらセッションが有効である間はログイン状態を継続したいのすがそのことででしょうか... -- umorigu
- BugTrack2/362: LDAPでのアカウント管理、BugTrack2/63: session変数を追加してほしい --
- 実装しました。あとドキュメントの整備が必要です -- umorigu
- pukiwiki.dev:Authenticationに初期ドキュメントを書きました。これを以って完了とします -- umorigu
- コレの報告し忘れてたかな。commit:103b575cf95f8b1a16ec7519bac56cfadc58b0d3でcatbody()の$_LINK['login'] 生成処理を$auth_type 設定依存に変更した際、AUTH_TYPE_BASICなどその他の場合に$login_link が初期化されず次の工程 htmlsc($login_link) で使用されNoticeエラーとなるようです --
- Noticeいろんなところで見つかりますね…対応します。 次のバージョン(1.5.2)ではログ出力できるようにして問題を早く見つけられるようにしたいです -- umorigu