PHPマイクロフレームワークのSilexでログイン処理をささっとつくる

Silexでつくるログインフォーム

Silexで簡単なログイン処理機能をつくる

簡単なお知らせ機能を作るにしてもログイン処理というものが必須になってきますが、Silexでは、組み込みの機能(Provider)を使えば、比較的簡単にHTMLフォームを使ったログイン処理機能をWebサイトに持たせることが可能です。コードも公式サイトに乗っているのをほとんどそのまま使えばOK。

「ささっと」とか言って結構長々と書いてますが、下手な文章力のせいです。コード自体はシンプルなので、我慢してお付き合いいただければ嬉しい限りです。

Silexで簡単なWebサイトを作る例はこちらをご覧ください。
過去記事: SilexでつくるシンプルWebサイト

SecurityServiceProviderを使う

ログイン処理の実装には、Secuiryプロバイダを読み込むことが必要です。まずComposerで依存関係を読み込みます。

$ composer require symfony/security

そして、Silexアプリのルートファイル(index.php)にプロバイダを下記のように登録します。細かいところの説明は後段にて。

$app->register(new SecurityServiceProvider);
$app["security.firewalls"] = array(
 "admin" => array(
  "pattern" => "^/admin",
  "form" => array("login_path" => "/login", "check_path" => "/admin/login_check"),
  "logout" => array("logout_path" => "admin/logout",   "invalidate_session" => true),
  "users" => function($app){return new UserProvider($app["db"]);}
 )
);

“pattern” => “^/admin”

ログイン認証で守られているURL先を記述します。
この場合、”【サイトURL】/admin”以降がログインを必要とするエリアとなります。

“login_path” => “/login”

ログイン情報を入力するフォームが記載されているページのパスになります。ルーティングの設定は自分で。

ログイン情報を持たずに”/admin”以降のパージに飛ぼうした場合、こちらにリダイレクトされます。そのため、“/admin”外のURLにしなければなりません。

“check_path” => “/admin/login_check”

ログイン認証をおこなうページへのPATHです。これは”login_path”とは逆に、“pattern”で示したPATH(“/admin”)より内側にしなければなりません。

また、ログインフォームのアクション先のPATHをここで指定したものと同じようになるようにしないといけないので要注意。

“logout_path” => “/admin/logout”

ログアウト処理をおこなうページへのPATHです。”/admin”より内側のページになります。

“invalidate_session” => true

ログアウト処理時にセッション情報を破棄するようにします。セッションを使用するので、SessionServiceProviderを登録する必要があります。

$app->register(new SessionServiceProvider);

new UserProvider($app[“db”])

ログインユーザーをデータベースと照合します。UserProviderの引数には、ユーザー情報が登録されているデータベースを渡します。

ログインユーザー情報をデータベースと照合する

UserProviderを作成する

ここが少し面倒くさいところなのですが、ログインユーザー情報(アカウント名とパスワード)をコードに直に書くのではなく、データベースに登録済みの情報と照合させたいと思います。そのためには、UserProviderInterfaceを実装したUserProviderを作成します。下記リンクのサンプルコード(use Symfony以降)がまさにそれなので、まるっとコピーしてしまいましょう。

カスタムユーザープロバイダーの定義

データベースにログインユーザーを登録する

データベースにログインユーザーが登録されていないと、ログインできません。ここも上記リンクのサンプルコード(use Doctrine以降)を使ってユーザーをデータベースに登録します。

ログインする際、パスワードは自動的にハッシュ値に変換されますので、データベースにはパスワードのハッシュ値そのものを登録する必要があります。

サンプルではハッシュ値をそのまま記載していますが、PHP(5.5以上)の組み込み関数のpassword_hashを使うと以下のようにハッシュ値が簡単に作成できます。

PHP関数リファレンス: password_hash

// サンプルコードから一部変更
"username" => "ユーザー名",
"password" => password_hash("任意のパスワード", PASSWORD_DEFAULT),
"roles" => "ROLE_ADMIN"

ユーザー登録用のスクリプトは適当に走らせてください。「パスを作って一度だけそこをたたく」などでいいと思います。

$app->mount("/create", include "登録用スクリプトのPATH");

など。やりようはいくらでもあると思いますので、やりやすい形でユーザーをデータベースに登録してください。ただ、上記のようにした場合は、後でコメントアウトするなり、削除するなりしておきましょう。

HTML(Form)側でやること

formタグのaction属性

formタグのaction属性に、上の”check_path”で指定したパスを設定します。(下記参照)

inputタグのname属性

inputタグのname属性で、下記のように、ユーザー名入力カラムには”_username”、パスワード入力カラムには”_password”と設定します。

<!-- 「/(スラッシュ)」は「_(アンダーバー)」に変換される -->
<form action="{{ path('admin_login_check') }}" method="post">
  <!-- Form -->
  <div>
    <label for="user">User Name</label>
    <input type="text" id="user" name="_user">
  </div>
  <div>
    <label for="password">Password</label>
    <input type="password" id="password" name="_password">
  </div>
  <div>
    <input type="submit" value="ログイン">
  </div>
</form>

ログアウト用のパス

これは、ログイン用フォームに書いたときとほぼ同じです。上の“logout_path”で指定したパスを書きます。

ここもスラッシュはアンダーバーに変換されます。

<a href="{{ path('admin_logout') }}">ログアウト</a>

ログインフォームへのルーティングを作って完成

最後にルーティングを設定します。他のページへルーティングをするのと同様にログインフォームの場所を指定するだけです。

$app->get('/login', function() use ($app) {
  return $app['twig']->render('ログインフォームへのパス');
});

以上で完成です!

(Visited 1,637 times, 1 visits today)

“PHPマイクロフレームワークのSilexでログイン処理をささっとつくる” への1件の返信

コメントは受け付けていません。