User.php

Download: zip user_class.4.1.zip

Description

Webページにパスワード認証をかけるためのクラスです。
MySQL(MariaDB)、SQLite3 などのデータベースを使います。

Files

User.phpクラス本体
user.config.php設定ファイル
login.phpログインフォーム
init.sqlデータベースを初期化するSQL

Install

init.sql を実行すると、users、user_property、user_session、user_log などのテーブルを作成します。
User.php と user.config.php を同じ(できればパスの通った)ディレクトリに置きます。
login.php を適当なディレクトリに置きます。

Configuration

テーブル users にユーザーを登録します。

userid0-9a-zA-Z を使ったランダムな32文字の文字列
loginnameログインに使用するための文字列
password任意の文字列 $PASSWORD を password_hash($PASSWORD, PASSWORD_BCRYPT) でハッシュ化して登録
auth0〜9 の数字(権限レベル 権限詳細は後述)

次に、テーブル user_property にユーザーの属性値を登録します。
init.sql を実行するとユーザー名とメールアドレスが属性値として登録できるようになりますが、他の属性値を登録できるようにしてもかまいません。 ここに登録した属性値は、ログイン後に読み出すことができます。(後述)
userid は、テーブル users に登録した文字列と同じ文字列を登録してください。

user.config.php を編集します。

'cookie_u' => 'u',
'cookie_g' => 'g',
'expires' => 3600 * 24 * 30,      // 保存したCookieの有効期限

'db_type' => 'mysql',             // 'mysql' or 'sqlite'
'db_host' => 'localhost',
'db_user' => 'DB_USERID',
'db_pass' => 'DB_PASSWORD',
'db_name' => 'DB_NAME',

'login_url' => 'https://DOMAIN/PATH/TO/login.php',  // ログインフォームのURL
'logout_url' => 'https://DOMAIN/',                  // ログアウトしたときの遷移先

cookie_u
指定した名前のクッキーにユーザーのセッションIDを保存します。
cookie_g
指定した名前のクッキーにユーザーのゲストIDを保存します。
expires
保存したクッキーの有効期限(秒)です。
有効期限の切れたユーザーはログインしなおすことになります。
db_type
'mysql' または 'sqlite' を指定します。
■ db_type が mysql の場合
db_user, db_pass
データベース'db_name'に対して読み書き権限のあるユーザーID/パスワードを指定します。
db_host, db_name
データベースのホストとデータベース名を指定します。
■ db_type が sqlite の場合
db_name
SQLite3データベース(ファイル)のパスを指定します。
db_host, db_user, db_pass
空文字('')で構いません。

Execution

パスワード認証をかけるPHPスクリプトに対して、次のように追加します。

<?php
...
require_once '/PATH/TO/User.php';
...
$user = new User();
$user->login('login');
...

ログアウトするには、メソッド $user->logout() を呼び出します。
User.php を読み込んでいるページのURLに ?logout を付けてアクセスすると、$user->logout() を実行するようにしてあります。
例: https://DOMAIN/?logout

権限レベル

ユーザー毎に権限レベルを設定して、指定した権限レベル以上のユーザーでなければログイン認証を失敗するように指定します。

権限レベル 0ゲストユーザーです。通常は指定しません。
権限レベル 1 〜 8一般ユーザーです。
権限レベル 9管理者ユーザーです。

ログインメソッドの引数で、ログイン可能なユーザーの権限レベルを指定します。

$user->login();引数なし ログインしなくても表示できるページです。
$user->login('login');ログインが必要なページです。(権限 1以上)
$user->login('admin');管理者(権限 9)のみログインできるページです。
$user->login('auth=N');権限 N (N は 1 〜 9)以上のユーザーがログインできるページです。

Properties

ログインに成功した場合、PHPスクリプトから次のようなデータを読み出すことができます。
$user->useridユーザーID
$user->loginnameログインID
$user->auth権限レベル
$user->pテーブル user_property に保存している内容が配列で格納されます。
$user->p['username']、$user->p['mailadrs'] など

Methods

$user->login()ログイン
$user->logout()ログインアウト

History


version 4.1   2025. 1. 2 - Modify the SQL statement
version 4.0   2022.11.27 - Use PDO::
version 3.2   2022.10.17 -
version 3.1.0 2022. 7.29 -
version 3.0.2 2021.10. 3 -
version 3.0   2021. 3.25 -
version 2.0   2019. 4. 5 - 2021. 3.23
version 1.0 - 2016.11.17
Webの開発に携わって最初に直面したのが、このようなログインシステムをどうするか?という問題でした。
パスワードを平文でデータベースに格納してはいけない。 ログインID=ユーザーIDだと、ユーザーIDの変更ができない。 権限でアクセスできるページを制御したい。 別の端末から同じユーザーがログインしたら、元の端末はログアウトしたい。 サーバーによっては、MySQLが使えなかったりする。 これらの処理を毎回書かないといけない。。。
そうして初めて関数化したのが2016年。 そこから、クラス化したり、PDOを使ってデータベースをハンドリングしたり、そのほかいろいろと改良を重ねて、2025年にバーション4.1となりました。
お客様によっては意外とパスワード認証をかけたいページが多いのですが、この User.php をニーズに合わせて小改造しながら設置しています。
そのうち、サインアップやパスワードリセットなど周辺のスクリプトも合わせて公開します。
Buy me a coffee