ホームページ >バックエンド開発 >PHPチュートリアル >Laravel 5 の基礎 (12) - 認定
Laravel 5 の基本 (12) - 認証
Laravel にはユーザー認証システムが付属しています。routes.php
を削除する場合は、
<code>Route::controllers([ 'auth' => 'Auth\AuthController', 'password' => 'Auth\PasswordController']);</code>
を追加してください。 php artisan route:list
を使用して確認してください。ブラウザで /auth/login
にアクセスすると、ログイン インターフェースが表示されます。システムのデフォルト app.blade.php
にある Google に関する項目をコメントアウトするのが最善です。そうしないと、おかしくなります。
登録、ログインを使用したり、パスワードを忘れたりすることもできます。
実際には送信後にユーザーの登録が失敗しましたが、larave は自動的に /home
にジャンプしました。 tinker
を使用すると、ユーザーが作成されたかどうかを確認できます。
は実際に AuthAuthController
で trait
を使用していますが、トライアトとは何ですか? PHP は単一継承のみをサポートしており、トレイトは PHP5.4 で追加されました。トレイトは実際にはメソッドのセットをカプセル化したもので、別のクラスに含めることができます。抽象クラスと同様に、直接インスタンス化することはできません。
AuthAuthController
には特性への参照があります:
<code>use AuthenticatesAndRegistersUsers;</code>
それを見つけて、登録後にどのようにジャンプするかを見てみましょう。 vendor/laravel/framework/src/Illuminate/Foundation/Auth/AuthenticatesAndregistersUsers.php
の中にかなり深く隠してるんですね、すごい。
<code> public function redirectPath() { if (property_exists($this, 'redirectPath')) { return $this->redirectPath; } //如果用户设置了 redirectTo 属性,则跳转到用户设置的属性,否则到home return property_exists($this, 'redirectTo') ? $this->redirectTo : '/home'; }</code>
OK、登録後にジャンプをカスタマイズするには、redirectTo
属性を設定するだけです。 AuthAuthContotroller
を変更します:
<code> protected $redirectTo = 'articles';</code>
最初に /auth/logout
を使用して確実に終了します。何か問題が発生しても心配しないでください。デフォルトのホームページはありません。再確認してください: auth/register
新しいユーザーを作成します。今回はこれでOKです。
再度ログアウトし、ログインを使用してログインします。
ここで、form_partial
に設定された一時的な非表示フィールドを削除し、コントローラーを変更します。
<code> public function store(Requests\ArticleRequest $request) { //你可以这样 //$request = $request->all(); //$request['user_id'] = Auth::id(); //更简单的方法 $article = Article::create($request->all()); //laravel 自动完成外键关联 Auth::user()->articles()->save($article); return redirect('articles'); }</code>
記事を追加し、tinker
を使用してチェックアウトします。
もちろん、少なくともログインする場合に限り、誰でも記事を公開できるようにすることは望ましくありません。コントローラーに保護を追加します。
<code> public function create() { if (Auth::guest()) { return redirect('articles'); } return view('articles.create'); }</code>
上記のコードは機能しますが、保護が必要なすべてのメソッドで上記の処理を実行する必要があります。これはあまりにも愚かです。ミドルウェア。
ミドルウェアは、パイプライン内の特定の瞬間に処理される処理パイプラインとして理解できます。この瞬間はリクエストまたはレスポンスになります。ミドルウェアの処理ルールによっては、リクエストがリダイレクトされたり、渡されたりする場合があります。
には、app/http/middleware
内に 3 つのミドルウェアが含まれています。詳しく見てみると、Closure $next
が次のミドルウェアを表しています。
app/http/kernel.php
にミドルウェアを登録します。 $middleware
セクションはすべての http を処理するミドルウェアを宣言し、$routeMiddleware
はルーティングのみを処理します。これらのミドルウェアの 1 つ以上を使用することを明示的に宣言する必要があります。
ArticlesController
全体を保護したいとします。コンストラクターにミドルウェアを直接追加します。
<code> public function __construct() { $this->middleware('auth'); }</code>
これで、すべてのメソッドが保護されます。
しかし、おそらくコントローラー全体を保護することは望ましくありません。そのメソッドの 1 つまたは 2 つだけを保護する場合はどうでしょうか?次のように処理できます:
<code> public function __construct() { $this->middleware('auth', ['only' => 'create']); //当然可以反过来 //$this->middleware('auth', ['except' => 'index']); }</code>
必ずしもコントローラーのコンストラクターにミドルウェアを導入する必要はありません。ルート内で直接宣言できます:
<code>Route::get('about', ['middleware' => 'auth', 'uses' => '[email protected]']);</code>
In kernel.php
'IlluminateFoundationHttpMiddlewareCheckForMaintenanceMode'
などの提供されたシステム ミドルウェアを使用すると、たとえば、システムはオンラインですが、処理のために一定期間一時的にシャットダウンする必要がある場合に、メンテナンス モードに入ることができます。コマンドラインを使用して、このミドルウェアの動作を確認してください。
<code>php artisan down</code>
Web サイトにアクセスすると、URL リクエストがすぐに返されることがわかります。オンラインのウェブサイト:
<code>php artisan up</code>
独自のミドルウェアを作成しましょう:
<code> php artisan make:middleware Demo</code>
次に、コードを追加します:
<code> public function handle($request, Closure $next) { //如果请求中含有 foo,我们就回到控制器首页 if ($request->has('foo')) { return redirect('articles'); } return $next($request); }</code>
すべてのリクエストで使用したい場合ミドルウェアは kernel.php
の $middleware
に登録する必要があります:
<code> protected $middleware = [ ... 'App\Http\Middleware\Demo', ];</code>
これでテストできるようになります。/articles/create?foo=bar
にアクセスすると、ホームページにリダイレクトされます。
この表示ミドルウェアを廃止して、実際に役立つミドルウェアを作成しましょう。このページは管理者がアクセスできる必要があるとします。
<code>php artisan make:middleware RedirectIfNotAManager</code>
処理コードを追加しましょう:
<code> public function handle($request, Closure $next) { if (!$request->user() || !$request->user()->isATeamManager()) { return redirect('articles'); } return $next($request); }</code>
以下のモデルを変更します:
<code> public function isATeamManager() { return false; }</code>
簡単にするために、直接 false を返します。今回は kernel.php
内にミドルウェアを $routeMiddleware
内に配置します。
<code> protected $routeMiddleware = [ ... 'manager' => 'App\Http\Middleware\RedirectIfNotAManager', ];</code>
テスト ルートを作成してテストしましょう:
<code>Route::get('foo', ['middleware' => 'manager', function() { return 'This page may only be viewed by manager';}]);</code>
ゲスト ID アクセスまたはログイン ID アクセスはホームページに戻りますが、isATeamManager()
を変更すると、 true
に戻る、ログイン ID にアクセスして、返された情報を確認します。