認証は、特定のURLにアクセス制限を設け、有効なアクセスのみ閲覧できるようにする機能です。
SyLフレームワークでは、DBでの認証、ファイルからの認証、(PHPの機能を使用した)ベーシック認証を提供しています。
SyLフレームワークの認証は、特定のURL(PATHINFO)以下を認証エリアとするフィルタで実現し、 自動的に認証判定を行います。
認証エリア内で、かつログイン実行判定と見なされるアクセスがあった場合、 ログイン認証を実行します。認証できれば、セッションにログインIDを保持した ユーザーオブジェクトをセットし、以後認証エリア内をアクセスできます。 認証できなければ、SYL_AUTH_LOGIN_ERROR_URL 定数で指定したURLにログインエラーとしてリダイレクトされます。
認証エリア内のログイン実行判定以外は、セッションに保存されているユーザーオブジェクトにログインIDがあるか判定し、 無ければエラーとして、SYL_AUTH_SESSION_ERROR_URL 定数で指定したURLにリダイレクトされます。
SyLフレームワークでは、下記の6つの認証方式を提供しています。
認証方式 | リソース | 概要 | 補足 |
---|---|---|---|
DB認証 | DB | ID/パスワードを元にDBに存在確認を行い認証する方式 | SyL_DBクラスを使用します。対応DBは、SyL_DBクラスに依存。 |
ファイル認証 | テキスト ファイル |
ID/パスワードを元にテキストファイルに存在確認を行い認証する方式 | |
設定ファイル 認証 |
設定ファイル (defines.xml) |
ID/パスワードを元に設定ファイル(defines.xml)の SYL_AUTH_LOGIN_PARAMETER 定数に存在確認を行い認証する方式 | |
ベーシック認証 (DB認証) |
DB | ベーシック認証ダイアログのID/パスワードを元にDBに存在確認を行い認証する方式 | PHPのベーシック認証機能に依存 |
ベーシック認証 (ファイル認証) |
テキストファイル | ベーシック認証ダイアログのID/パスワードを元にテキストファイルに存在確認を行い認証する方式 | PHPのベーシック認証機能に依存 |
ベーシック認証 (設定ファイル 認証) |
DB | ベーシック認証ダイアログのID/パスワードを元に設定ファイル(defines.xml)の SYL_AUTH_LOGIN_PARAMETER 定数に存在確認を行い認証する方式 | PHPのベーシック認証機能に依存 |
「DB認証」(+SSL)が一般的に使用頻度が高いと思いますが、短時間で簡単に認証機能を作成したい場合は「ベーシック認証(設定ファイル認証)」(修正するファイルは defines.xml のみ)がお手軽です。
時と場合によって、リソースに対してハッシュ化(md5など)してパスワードを保存していることや、 パスワードを平文で流さないために、クライアント側でパスワードをハッシュ化して送信することもあります。 そのような状態に対応するために設定する設定ファイルの定数が SYL_AUTH_PASSWORD_HASH で、下記がそのパターン例になります。
クライアント側の ハッシュ化 |
サーバー側リソースの ハッシュ化 |
SYL_AUTH_PASSWORD_HASH の設定値 |
---|---|---|
なし(平文) | なし(平文) | (なし) |
なし(平文) | md5 | :md5 |
md5 | md5 | md5:md5 |
※ ハッシュ化方式は、「md5」「sha1」のみサポート
※ クライアント側とサーバーリソースを共にハッシュ化する場合、ハッシュ化方法を統一する。
認証の設定は下記の順序で行います。
(1) 認証エリア(SYL_AUTH_PATHINFO)を決定する
(2) 認証方式(SYL_AUTH_TYPE)を決定する
(3) 認証タイプによるパラメータを設定する
(4) 認証フィルタを設定する
(5) 認証処理の確認
(1) 認証エリア(SYL_AUTH_PATHINFO)を決定する
認証エリアは、PATH_INFOのURL階層毎に設定します。
例えば、/index.php/app/admin/... のadmin以下を認証エリアにする場合は、
認証エリアURLを /app/admin とします。
コントローラに対する全ての PATH_INFO URLを認証エリアにする場合は、
特に認証エリアを指定する必要はありません。
(2) 認証方式(SYL_AUTH_TYPE)を決定する
2. 認証の種類 を参考に認証方式を決定します。
(3) 認証タイプによるパラメータを設定する
(1) で決定した認証タイプ(認証方式)を設定ファイルに記述します。 設定ファイルは、使用するアプリケーションのみに限定するようにアプリケーション用の設定ファイルに記述したほうがよいでしょう。
SYL_APP_CONFIG_DIR /defines.xml 例) /home/kwata/SyL/webapp/app/example/config/defines.xml
ここでは、認証タイプを「DB認証」の設定例を示します。
... <define name="SYL_AUTH_USER_CLASS">App.User</define> <define name="SYL_AUTH_PATHINFO">/adimin/</define> <define name="SYL_AUTH_LOGIN_ERROR_URL">/index.php/login.html</define> <define name="SYL_AUTH_SESSION_ERROR_URL">/index.php/sesserr.html</define> <define name="SYL_AUTH_TYPE">DB</define> <define name="SYL_AUTH_TYPE_PARAMETER">users:user_id:password</define> <define name="SYL_AUTH_PASSWORD_HASH"></define> ... <define name="SYL_DB_DSN">mysql:dbname=syl;host=localhost;port=3306;
user=syl;passwd=syl</define> ...
※ それぞれの設定値については、「3.11 defines.xmlで定義される定数」の認証関連を参照。
(4) 認証フィルタを設定する
フィルタの設定ファイルの内容は、下記のようにします。(既存のファイルに赤字の箇所を追記)
使用するアプリケーションのみに限定するようにアプリケーションフィルタとして設定したほうがよいでしょう。
SYL_APP_CONFIG_DIR /filters.xml 例) /home/kwata/SyL/webapp/app/example/config/filters.xml
...
<syl-filters>
...
<filter name="auth"
path="(.+)\.php"
class="SyL_FilterAuth"
file="framework/Filter/SyL_FilterAuth.php"
enable="true">
<preAction>
<arg type="component" reference="true">data</arg>
</preAction>
<postAction>
<arg type="component" reference="true">data</arg>
</postAction>
</filter>
...
</syl-filters>
(5) 認証処理の確認
認証処理が行われるか実際にアクセスして確かめます。 例えば、認証エリアを /app/admin にした場合、 ブラウザで「(コントローラURL)?/app/admin/」にアクセスして、 セッションエラー画面に遷移するか確認します。
ログイン認証判定を行う場合は、認証エリア外にユーザーID、パスワードを入力できる画面を作成し、
認証エリア内に対して送信(POST)し、ログイン認証できるか確認します。
その際に作成するユーザーID、パスワードの要素名は、それぞれ login_username と login_password にしてください。
(これらの値は、lib/App/User.php クラスでオーバーライドすると変更可能です)