LaravelおよびSentryの管理パネル用のエレガントなログインフォーム

サイトを作成するときは、コントロールパネルにアクセスするためにログインとパスワードを入力するのに時間がかかる必要があります。 開発プロセスをスピードアップするために、管理パネルへのシンプルで便利でエレガントなアクセス方法を準備するためのレシピを共有したいと思います。



この記事には、サイトを開発するときにLaravelを使用するためのいくつかの基本的なテクニックの説明が含まれており、このフレームワークを学習し始めた人に役立ちます。 たとえば、Ubuntu 12.04、PostgreSQL 9.3、Nginx 1.1.19、PHP 5.5.7、Composer、およびLaravel 4.1を使用して作成された新しいプロジェクトを使用します。 PostgreSQLの制御下で、サンプルデータベースが回転し、同じパスワードを持つサンプルユーザーがアクセスできます。 Nginxは、アドレスにアクセスするときに examples.loc



ブラウザーの examples.loc



は、スタブのメインページを開きます。このページには、Laravelがバンドルされており、「You are入荷しました」という碑文が付いています。



編集可能なファイルへのすべてのパスは、プロジェクトディレクトリを基準にして示されます。



環境



まず、Laravelにローカル環境をセットアップしました。 これを行うには、ディレクトリapp/config/local



を作成し、それにdatabase.php



ファイルを追加しdatabase.php





 <?php /** * app/config/local/database.php */ return array( 'default' => 'pgsql', 'connections' => array( 'pgsql' => array( 'driver' => 'pgsql', 'host' => 'localhost', 'database' => 'examples', 'username' => 'examples', 'password' => 'examples', 'charset' => 'utf8', 'prefix' => '', 'schema' => 'public', ), ), );
      
      





Laravelにデフォルトでlocal



環境を使用するように依頼します。 これを行うには、ファイルbootstrap / start.phpを編集し、行'your-machine-name'



'*'



置き換え'your-machine-name'





 //   bootstrap/start.php $env = $app->detectEnvironment(array( 'local' => array('*'), ));
      
      







セントリー接続



Sentryの接続手順へのリンクは、記事の最後にあります。 簡単に言うと、私は次のことを行います。

"cartalyst/sentry": "2.0.*"



require



ブロックのcomposer.json



"cartalyst/sentry": "2.0.*"



ます。

 //  composer.json { "name": "laravel/laravel", "description": "The Laravel Framework.", "keywords": ["framework", "laravel"], "license": "MIT", "require": { "laravel/framework": "4.1.*", "cartalyst/sentry": "2.0.*" }, ...
      
      





コマンドを実行します:

$ composer update





$文字を入力する必要はありません
$記号は、コマンドラインでcomposer update



と入力する必要があることを意味します


ファイルapp / config / app.phpのサービスプロバイダーのリストに追加します。

'Cartalyst\Sentry\SentryServiceProvider',







app / config / app.phpファイルのエイリアスのリストに追加します。

'Sentry' => 'Cartalyst\Sentry\Facades\Laravel\Sentry',







Sentry移行の実行:

$ php artisan migrate --package=cartalyst/sentry







Sentry構成ファイルを公開します。

$ php artisan config:publish cartalyst/sentry







app/config/packages/cartalyst/sentry/config.php



編集app/config/packages/cartalyst/sentry/config.php



開きapp/config/packages/cartalyst/sentry/config.php



。 その中に文字列'login_attribute' => 'email'



を見つけて'login_attribute' => 'username'



に置き換え'login_attribute' => 'username'



。これにより、Sentryは電子メールではなくログインによってユーザーを認証します。



Sentryの移行を実行すると、 email



フィールドはあるがusername



ないusers



テーブルが作成されました。 したがって、Sentryを機能させるには、不足しているフィールドを追加する必要があります。 これを行うには、移行を作成します。

$ php artisan migrate:make alter_users_add_username







app/database/migration



ディレクトリにファイルが表示されます。このファイルは現在の日付と時刻で構成され、 alter_users_add_username.php



alter_users_add_username.php



ます。 次のように編集します。

 <?php /** * app/database/migration/0000_00_00_000000_alter_users_add_username.php */ use Illuminate\Database\Migrations\Migration; class AlterUsersAddUsername extends Migration { /** * Run the migrations. * * @return void */ public function up() { Schema::table('users', function($table) { $table->string('username'); }); } /** * Reverse the migrations. * * @return void */ public function down() { Schema::table('users', function($table) { $table->dropColumn('username'); }); } }
      
      





移行を確認するには

$ php artisan migrate







移行が正常にロールバックされたことを確認するには、次のことを行います。

$ php artisan migrate:rollback







users



テーブルにスーパーユーザーエントリを追加する別の移行を作成します。

$ php artisan migrate:make add_user_admin







app/database/migrate



ディレクトリでadd_user_admin.php



で終わるファイルをadd_user_admin.php



て編集します:

 <?php /** * app/database/migration/0000_00_00_000001_add_user_admin.php */ use Illuminate\Database\Migrations\Migration; class AddUserAdmin extends Migration { /** * Run the migrations. * * @return void */ public function up() { $user = Sentry::createUser(array( 'username' => 'admin', 'email' => 'admin@examples.loc', 'password' => 'password', 'activated' => 1, 'permissions' => array( 'superuser' => 1, ), )); } /** * Reverse the migrations. * * @return void */ public function down() { User::where('username', '=', 'admin')->firstOrFail()->delete(); } }
      
      





移行のロールバックとロールバックの方法を確認します。 そして、ユーザーの認証を担当するコントローラーを作成します。



ログインフォーム



app/controllers



ディレクトリで、 AuthController.php



ファイルapp/controllers



作成します。

 <?php /** * app/controllers/AuthController.php */ class AuthController extends BaseController { /** *    * * @return Illuminate\View\View */ public function getLogin() { $title = ''; return View::make('auth.login', compact('title')); } }
      
      





getLogin()



メソッドは、ページタイトルを$title



変数を介してauth.login



auth.login



。このauth.login



は、管理者ログインページを表示します。



auth.loginビューを作成します。 これを行うには、 auth



ディレクトリをapp/views



ディレクトリに追加し、その中にlogin.blade.php



ファイルを作成します。

 /** * app/views/auth/login.blade.php */ @extends('layout') @section('main') <div class="container"> {{ Form::open(array('class' => 'form-signin')) }} @if (!$errors->isEmpty()) <div class="alert alert-danger"> @foreach ($errors->all() as $error) <p>{{ $error }}</p> @endforeach </div> @endif <h2 class="form-signin-heading">{{ $title }}</h2> {{ Form::text('username', null, array('class' => 'form-control', 'placeholder' => '')) }} {{ Form::password('password', array('class' => 'form-control', 'placeholde' => '')) }} <label class="checkbox"> {{ Form::checkbox('remember-me', 1) }}   </label> {{ Form::submit('', array('class' => 'btn btn-lg btn-primary btn-block')) }} {{ Form::close() }} </div> @stop
      
      





login.blade.php



テンプレートは、 login.blade.php



テンプレートを拡張します。 したがって、私はapp/views



ディレクトリに作成しapp/views





 /** * app/views/layout.blade.php */ <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>{{ $title }}</title> @section('styles') {{ HTML::style('//netdna.bootstrapcdn.com/bootstrap/3.0.3/css/bootstrap.min.css') }} {{ HTML::style(URL::asset('styles/base.css')) }} @show </head> <body> @yield('main') @section('scripts') {{ HTML::script('//netdna.bootstrapcdn.com/bootstrap/3.0.3/js/bootstrap.min.js') }} @show <body> </html>
      
      





コントローラーメソッドとそれによって返される表現が存在した後、ルーティングを構成して、GET要求がアドレスに送信されるようにする必要があります。 examples.loc/login



examples.loc/login



は、 getLogin()



メソッドによって処理されました。 これを行うには、次のコードをapp/routes.php



ファイルに追加します。

 //  app/routes.php ... Route::group(array('before' => 'guest'), function () { Route::get('login', array( 'as' => 'auth.login', 'uses' => 'AuthController@getLogin' )); });
      
      





Route::get()



使用して、 auth.login



というルートRoute::get()



定義します。これgetLogin()



AuthController



コントローラーのgetLogin()



/login



メソッドにGETリクエストを送信し/login





また、 auth.login



グループにauth.login auth.login



を配置しました。 このグループに含まれるルートの前に、 guest



フィルターが実行されます。 このフィルターは、ユーザーがゲストである場合にのみ、アドレス/login



でのGETリクエストの処理が行われることを意味し/login



。 許可されていません。



guest



フィルターを書き換えて、Sentryを使用するようにします。 これを行うには、 app/filters.php



ファイルで、 guest



フィルターコードを変更します。

 //  app/filters.php ... Route::filter('guest', function() { if (Sentry::check()) return Redirect::to('/'); }); ...
      
      





これで、ログインフォームがブラウザでどのように見えるかを確認できます。 これを行うには、に行きます examples.loc/login



examples.loc/login



および...



エラーメッセージCall to undefined method Illuminate\Cookie\CookieJar::get()



ます。



Googleの軽い動きで、Sentry 2.0はLaravel 4.0と互換性がありますが、4.1とは互換性がないことがわかりました。 Sentry 2.1がすでにリリースされているのは良いことです。 エラーを取り除くために、 composer.json



のSentryのバージョンを2.1に変更します。

 //  composer.json { "name": "laravel/laravel", "description": "The Laravel Framework.", "keywords": ["framework", "laravel"], "license": "MIT", "require": { "laravel/framework": "4.1.*", "cartalyst/sentry": "2.1.*" }, ...
      
      





コマンドを実行します:

$ composer update







もう一度開いてみる examples.loc/login



examples.loc/login



とログインフォームとパスワードが表示されます。 フォームをエレガントに見せるために、CSSを追加する必要があります。 これを行うには、 public



ディレクトリにstyles



ディレクトリを作成し、 base.css



ファイルを追加します。

 /** * public/style/base.css */ body { padding-top: 40px; padding-bottom: 40px; background-color: #eee; } .form-signin { max-width: 330px; padding: 15px; margin: 0 auto; } .form-signin .form-signin-heading, .form-signin .checkbox { margin-bottom: 10px; } .form-signin .form-signin-heading { text-align: center; } .form-signin .checkbox { font-weight: normal; } .form-signin .form-control { position: relative; font-size: 16px; height: auto; padding: 10px; -webkit-box-sizing: border-box; -moz-box-sizing: border-box; box-sizing: border-box; } .form-signin .form-control:focus { z-index: 2; } .form-signin input[type="text"] { margin-bottom: -1px; border-bottom-left-radius: 0; border-bottom-right-radius: 0; } .form-signin input[type="password"] { margin-bottom: 10px; border-top-left-radius: 0; border-top-right-radius: 0; }
      
      







コントローラー



フォームがきれいに表示されるようになりましたが、「ログイン」ボタンをクリックするとエラー404が返されるので、 /login



アドレスに送信されたAuthController



POST要求ハンドラーを追加する必要があります。

 <?php /** * app/controllers/AuthController.php */ class AuthController extends BaseController { /** *    * * @return Illuminate\View\View */ public function getLogin() { $title = ''; return View::make('auth.login', compact('title')); } /** *      * * @return Illuminate\Http\RedirectResponse */ public function postLogin() { Input::flash(); try { $credentials = array( 'username' => Input::get('username'), 'password' => Input::get('password') ); $user = Sentry::authenticate($credentials, Input::get('remember-me')); } catch (Exception $e) { return Redirect::to(route('auth.login')) ->withErrors(array($e->getMessage())); } return Redirect::intended(route('admin')); } /** *   * * @return Illuminate\Http\RedirectResponse */ public function getLogout() { Sentry::logout(); return Redirect::route('auth.login'); } }
      
      





postLogin()



メソッドでは、フォームを介して送信されたデータは、 Input::flash()



を使用してセッションに保存されます。 try



ブロックで、Sentryはユーザーの認証を試みます。 ログインとパスワードの入力フォームで「Remember me」チェックボックスを設定すると、 Sentry::authenticate()



の2番目のパラメーターがtrue



に渡され、Sentryは認証に成功した場合にユーザーを記憶します。 何らかの理由で認証が成功しなかった場合、 catch



Redirect::to()



メソッドがエラーメッセージのある場所のログインおよびパスワード入力ページに送信します。 認証が成功した場合、 Redirect::intended()



メソッドは、ログインおよびパスワード入力フォームにリダイレクトされたときに入力したいページにユーザーを送ります。 そのようなページが指定されていない場合、アドレス/admin



でページが開き、 /admin



という名前のルートが関連付けられます。



getLogin()



メソッドは、ユーザーをログアウトする方法の最も単純な実装です。 終了すると、ユーザーはログインおよびパスワード入力ページにリダイレクトされます。



ルーティングの構成に進む前に、 /admin



送信されたリクエストを処理するメソッドを追加する必要があります。 これを行うには、ファイルapp/controllers/HomeController.php



を次のように編集します。

 <?php /** * app/controllers/HomeController.php */ class HomeController extends BaseController { public function showWelcome() { return View::make('hello'); } public function getAdmin() { return link_to(route('auth.logout'), ''); } }
      
      





getAdmin()



メソッドは単にページに「終了」リンクを表示します。クリックすると、ユーザーはログアウトします。



ルーティング



さて、新しいメソッドがリクエストを処理できるように、 app/routes.php



で編集しapp/routes.php





 /** * app/routes.php */ Route::get('/', function() { return View::make('hello'); }); Route::group(array('before' => 'guest'), function () { Route::get('login', array( 'as' => 'auth.login', 'uses' => 'AuthController@getLogin' )); Route::post('login', array( 'before' => 'csrf', 'uses' => 'AuthController@postLogin' )); }); Route::group(array('before' => 'auth'), function () { Route::get('admin', array( 'as' => 'admin', 'uses' => 'HomeController@getAdmin', )); Route::get('logout', array( 'as' => 'auth.logout', 'uses' => 'AuthController@getLogout' )); });
      
      





guest



フィルターが実行される前のルートの最初のグループには、GETおよびPOST要求の/login



アドレスのルーティングが含まれます。 guest



フィルターは、 guest



からのリクエストのみが/login



アドレスで処理されることを意味し/login



。 権限のないユーザー。



ルートの2番目のグループ( auth



フィルターが実行される前)には、アドレス/admin



および/logout



ルーティングが含まれ/logout



auth



フィルターは、許可されたユーザーからのアドレスのみがこれらのアドレスで処理されることを意味します。



また、Sentryを使用するようにauth



フィルターを編集する必要があります。 これを行うには、 app/filters.php



ファイルapp/filters.php



開き、次のようにauth



フィルターを変更します。

 //  app/filters.php ... Route::filter('auth', function() { if (!Sentry::check()) return Redirect::guest(route('auth.login')); }); ...
      
      







これで、管理者ログインとパスワードpasswordを使用して管理者パネルにログインを試みることができます。 権限のないユーザーは/admin



ページにアクセスできません。認証に成功した場合にのみアクセスできます。 また、認証後、メインページへのリダイレクトが発生するため、 /login



ページに移動することはできません。



この例が初心者の開発者がLaravelのいくつかの要素をよりよく理解するのに役立つことを願っています。



関連リンク



getcomposer.org/doc/00-intro.md#installation-nix

laravel.com/docs/installation#install-laravel

cartalyst.com/manual/sentry/installation/laravel-4



UPD

Github.com/bskton/examples/tree/eformサンプルコード



All Articles