Apache 2.2.x でベーシック認証(2) ~ MySQL を利用する~

前回は、テキストファイルによるベーシック認証を行ったが、今回はテキストファイルの代わりに MySQL を利用する。テキストファイルを利用する方法は簡単で便利だが、ユーザー数が増えてきたり、ユーザーをアプリケーションで管理するときに不便だ。そこで、MySQL のテーブルを利用して認証する方法を検証してみた。

検証環境は、Cent OS 6.4 と Apache 2.2.15、MySQL 5.1.69だ。Windows 環境の場合、残念ながらApache でダウンロードできるバイナリでは動作しない。mod_auth_mysql モジュールが含まれていないためだ。

テキストファイルを利用した場合と同様、MySQL を利用する基本認証は複数のモジュールを経由して行われる。

  1. AuthType Basic により mod_auth_basic が起動
  2. AuthMYSQLEnable on により mod_auth_mysql が起動し、定義に従ってデータベースを参照する
  3. Require の定義に従って、mod_authz_user が承認

MySQL を使ってベーシック認証を行う場合、以下のような定義が必要になる。

#基本認証
LoadModule auth_basic_module modules/mod_auth_basic.so
#ホスト名/IPアドレスによる制御
LoadModule authz_host_module modules/mod_authz_host.so
#ユーザー名による承認
LoadModule authz_user_module modules/mod_authz_user.so
#MySQL の認証モジュール
LoadModule mysql_auth_module modules/mod_auth_mysql.so

...

<Directory "/var/www/html">
    Options FollowSymLinks
    AllowOverride None
    
    AuthType Basic
    AuthName "User Zone"

    AuthMYSQLEnable on
    # MySQL に接続する時のユーザー ID
    AuthMySQLUser user
    # MySQL に接続する時のパスワード
    AuthMySQLPassword password
    # MySQL のデータベース名
    AuthMySQLDB auth
    # AuthMySQLDB で指定したデータベース内のテーブル名
    AuthMySQLUserTable users
    # AuthMySQLUserTable で指定したテーブル内のユーザーID列
    AuthMySQLNameField login_id
    # AuthMySQLUserTable で指定したテーブル内のパスワード列
    AuthMySQLPasswordField password
    # パスワード列の暗号化方式
    AuthMySQLPwEncryption sha1

    Require valid-user
    
    Order allow,deny
    Allow from all
</Directory>

MySQL で認証を行うための「mod_auth_mysql」モジュールを読み込み、「AuthMYSQLEnable」に「On」を指定すると MySQL による認証が有効になる。以降の定義は、MySQL と接続する時の認証情報、利用するデータベース、テーブル、列名、パスワードの暗号化方式になる。

認証に利用するテーブルには、Apache で利用しない列が含まれていてもよい。Apache で上記の定義を行っている前提で、プライマリーキーに user_id を用意し、AUTO INCREMENT する列を追加したテーブルを作成する例を挙げる。

CREATE DATABASE auth;
USE auth;
CREATE TABLE users (
    user_id int(11) NOT NULL AUTO_INCREMENT,
    login_id varchar(40) NOT NULL,
    password varchar(40) NOT NULL,
    PRIMARY KEY (user_id)
);
GRANT SELECT ON auth.users TO user@localhost IDENTIFIED BY 'password';
FLUSH PRIVILEGES;

ユーザーを追加する場合は、SQL で行を追加するだけだ。

INSERT INTO users VALUES ('user1', SHA1('password'));

暗号化方式に SHA1 を使っているので、パスワード列に挿入するデータは SHA1 関数を通している。


コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

Time limit is exhausted. Please reload CAPTCHA.