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.phpalter_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.loginauth.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は認証に成功した場合にユーザーを記憶します。 何らかの理由で認証が成功しなかった場合、 catchRedirect::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ルーティングが含まれ/logoutauthフィルターは、許可されたユーザーからのアドレスのみがこれらのアドレスで処理されることを意味します。

また、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サンプルコード

Source: https://habr.com/ru/post/J206908/


All Articles