ログインしてさらにmixiを楽しもう

コメントを投稿して情報交換!
更新通知を受け取って、最新情報をゲット!

Let's PHPコミュの会員制サイトの作り方

  • mixiチェック
  • このエントリーをはてなブックマークに追加
PHPを使って会員制サイトを作りたいと思っています。

Basic認証ではなく、データベースにIDとパスワードを保存してユーザー認証したいと思っています。
PEARのAuthを使って認証できたのですが、他のページに移った場合にどうすればいいかわかりません。
SESSIONでユーザー情報を保持したりするのでしょうか?

また、入門書とか参考になるサイトとかあれば教えてください。

コメント(13)

あまり詳しくない人です。

たとえばXOOPSみたいな、会員制を実現しているOSSなアプリのコードを参考にしてみるというのはどうでしょうか?
 セッションにログイン情報を保持し、毎回セッションに情報の有無を確認すると良いかもしれません。

 具体的には、セッション(認証状態)を管理する関数を別のファイルに設け、それをインクルードした後にその関数を呼び出してログイン状態ではなかったらログインページにリダイレクトするなどの方法ですね。

 そうすると、認証の仕様が変更になった場合でも、一つのファイルを修正するだけで済みます。

 最初から大きいシステムの中ではなく、それ単体のプログラムを作って仕組みを理解されてから実装を行ったほうが良いと思います。
みやはら@かそうか?さん、ありがとうございます。

ちょっと高度過ぎて難しいです。

よう♪さん、ありがとうございます。

やっぱりセッションですね。

ぺろりんさん、siu-kaidoさん、ありがとうございます。

まず最初は
$options = array(
'dsn' => "mysql://user:password@localhost/database",
);
$a = new Auth("DB", $options, "loginFunction");

$a->start();

if ($a->checkAuth()) {
ですが、他のページではどのように認証をチェックすればよいのでしょうか?

たくみさん、BeHappy?さん、ありがとうございます。

リダイレクトするにはどの関数を使うのでしょうか?
ボタンやリンクを使わずにリダイレクトできるでしょうか?
質問者の方はWEB系に不慣れなだけなようなので

PHP Dream : セッションを利用した入力フォーム
http://php.dori-mu.net/session.html

サクッと検索してみて、ズバリなものは見つかりませんがこの辺がセッションでは参考になると思います。
 →値の引き回し

で、リダイレクトにはよく下記の関数を使ってます。
header()関数/PHP関数リファレンス
http://www.scollabo.com/banban/php/ref/ref_header.html
→使い方をミスすると、すでにヘッダが送出されています云々文句言われますが、その辺の回避策はエラーメッセージでググれば色々例が出ます。

?>を書かないとか、?>以降にスペースなどがないか、実はエラーメッセージがすでに出力されているとかとか。

ちなみに
PHPプロ!マニュアル
http://www.phppro.jp/phpmanual/
で、redirectと全文検索すればheader関数の説明が出てきたりします。
#さすがに、リダイレクト とカタカナで入れるとだめでしたが。

ここまでそろえば、google先生に聞きつついけるのではないでしょうか?
あと、遠回りなようですがPHPを使う上で、HTTPの知識は欠かせないのでheader関数を手がかりに調べていけば、今後に繋がるかと思います。

あと、実装できたら終わりではなく、セッションハイジャックなどその辺のセキュリティ周りの知識を入れておかないと、いつか痛い目を見るかもしれません。

ご参考になれば幸いです。
Balthazarさん、詳しくありがとうございます。

無理にAuthを使う必要はないのですね?
実際Authを使うべきなのでしょうか?

ASP.NETはちょっとできるのですが、PHPのほうがはるかに普及してるので、入門書片手に勉強中です。
(でも会員制のサイトのサンプルが正常に動かない・・・)
たけし 様

Pear::Authは便利なライブラリという位置づけなので、要件によっては自分で独自実装した場合が早い場合があります。

そのため、結論から言えば「無理に使う必要はない」という結論になります。
ただ、PHP駆け出しの人が書くコードよりは色々なことを考慮されているはずなので、遠回りなようですが許す限りライブラリの利用をおすすめします。

//とはいえ、Pear::Authは機能が低いとかちらほらかかれているようですが…
//私の本業はサーバ構築・運用屋なので、この辺は本職の方に言わせると違うかもしれません

Pear::Authについてですが

ユーザー認証(PEAR::Auth) - PEAR入門
http://www.phpbook.jp/pear/pear_auth/



PEAR入門 PHP標準ライブラリを極める! - WINGS
http://www.wings.msn.to/index.php/-/A-03/4-7981-0959-2/

がよいかもしれません。
(PEAR本は持ってないので、是非立ち読みで中身を確認してください。)

なぜ動かないかは現時点では情報がないので何とも言えませんが、

<スクリプト搭載サーバの管理者権限をもっている場合>
サーバ側のphp.iniで

error_reporting = E_ALL
display_startup_errors = On

とするか、

<rootを持っていない場合>
もしくはスクリプト中(スクリプトの冒頭が良いと思います)で

ini_set("error_reporting",E_ALL);
ini_set("display_errors","1");

として、すべてのエラーを出すようにするといくらか幸せになれるかもしれません。
いい例ではないかも知れませんが、簡単な例でご説明します。
(Pear::Auth は使いません)

まずログイン時、セッション変数に「正解のパスワード」と「ユーザーが画面から入力したパスワード」の2つの値を保持させます。

// ログイン処理
session_start();
$_SESSION['PASSWD_RIGHT'] = (正解のパスワード);
$_SESSION['PASSWD_INPUT'] = (入力されたパスワード);

そして、会員しかアクセスできない全ページのトップに下記の処理を記述します。
(上記ログイン処理の直後にも必要です。その場合、session_start()は1度のみ)

// 認証処理
session_start();
if( $_SESSION['PASSWD_RIGHT'] != $_SESSION['PASSWD_INPUT'] ){
    // ログインエラーページを表示
    (HTML表示 or リダイレクト等)
    // 処理終了
    exit();
}

こういうやり方でも出来ますよ、というご参考までに。
混乱させるつもりはありませんが、他にもこんなのがあります。

Zend FrameworkのZend_Auth
フレームワークという名前がついていますが、実際はライブラリのようなものなので単体利用が可能です。
http://framework.zend.com/manual/ja/zend.auth.html

比較的オープンな会員システムの場合はPHP OpenIDはどうでしょうか?
ユーザーの会員登録負荷が軽減される…かも。
全世界共通の会員システムです。
http://www.openidenabled.com/php-openid/
Balthazarさん、ありがとうございます。

ini_set("error_reporting",E_ALL);
ini_set("display_errors","1");
を記述しましたが、何の変化もありません。

本のサンプルが動かない件は出版社に質問のメールをしてみました。

ヤスモさん、ありがとうございます。

参考にします。

ゆきさん、ありがとうございます。

OpenIDはアメリカのYahoo!が採用したものですね。

ログインすると、みんなのコメントがもっと見れるよ

mixiユーザー
ログインしてコメントしよう!

Let's PHP 更新情報

Let's PHPのメンバーはこんなコミュニティにも参加しています

星印の数は、共通して参加しているメンバーが多いほど増えます。

人気コミュニティランキング