Your SlideShare is downloading. ×
認証機能で学ぶ Laravel 5 アプリケーション
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×
Saving this for later? Get the SlideShare app to save on your phone or tablet. Read anywhere, anytime – even offline.
Text the download link to your phone
Standard text messaging rates apply

認証機能で学ぶ Laravel 5 アプリケーション

200
views

Published on

第21回関西PHP勉強会

第21回関西PHP勉強会

Published in: Software

0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
200
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
0
Comments
0
Likes
1
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide

Transcript

  • 1.  @shin1x1 2015/04/20 21th Kansai PHP Study 認証機能に学ぶ Laravel 5 アプリケーション
  • 2. デフォルト認証機能
  • 3. Authentication (c) 2015 Masashi Shinbara @shin1x1 • デフォルトプロジェクトに含まれている • php artisan migrateすれば、すぐに使える • 実際に見てみよう
  • 4. ユーザ登録 (c) 2015 Masashi Shinbara @shin1x1
  • 5. ログイン (c) 2015 Masashi Shinbara @shin1x1
  • 6. パスワードリセット (c) 2015 Masashi Shinbara @shin1x1
  • 7. こんな機能も (c) 2015 Masashi Shinbara @shin1x1 • Cookieトークンによる自動ログイン
 (Remeber me) • Basic認証(要実装) • ソーシャル認証(要実装 / Twitter等)
  • 8. 認証機能に見る アプリケーション実装例
  • 9. Flow (c) 2015 Masashi Shinbara @shin1x1
  • 10. Routing (c) 2015 Masashi Shinbara @shin1x1
  • 11. Routing Route::controllers([
 'auth' => 'AuthAuthController',
 'password' => 'AuthPasswordController',
 ]); /auth, /password へのルーティング コントローラのメソッドへ連結
  • 12. Controller Method (c) 2015 Masashi Shinbara @shin1x1 • HTTPメソッド + パス • GET /auth/register
 => getRegister() • POST /auth/register
 => postRegister()
  • 13. Routing - auth (c) 2015 Masashi Shinbara @shin1x1 Method URI Action GET¦HEAD /auth/register AuthController@getRegister POST /auth/register AuthController@getRegister GET¦HEAD /auth/login AuthController@getLogin POST /auth/login AuthController@postLogin GET¦HEAD /auth/logout AuthController@getLogout
  • 14. Routing - password (c) 2015 Masashi Shinbara @shin1x1 Method URI Action GET¦HEAD /password/email PasswordController@getEmail POST /password/email PasswordController@postEmail GET¦HEAD /password/reset PasswordController@getReset POST /password/reset PasswordController@postReset
  • 15. Controller (c) 2015 Masashi Shinbara @shin1x1
  • 16. Controller (c) 2015 Masashi Shinbara @shin1x1 • AuthControllerとPasswordController • コンストラクタのみで、実処理はトレイトに実装 • 独自コントローラにもトレイトを再利用できる
  • 17. Controller <?php namespace AppHttpControllersAuth;
 
 // (snip)
 
 class AuthController extends Controller
 {
 use AuthenticatesAndRegistersUsers;
 
 public function __construct(Guard $auth, Registrar $registrar)
 {
 $this->auth = $auth;
 $this->registrar = $registrar;
 
 $this->middleware('guest', ['except' => 'getLogout']);
 }
 
 } コンストラクタインジェクション
  • 18. Controller <?php namespace AppHttpControllersAuth;
 
 // (snip)
 
 class AuthController extends Controller
 {
 use AuthenticatesAndRegistersUsers;
 
 public function __construct(Guard $auth, Registrar $registrar)
 {
 $this->auth = $auth;
 $this->registrar = $registrar;
 
 $this->middleware('guest', ['except' => 'getLogout']);
 }
 
 } ミドルウェア(ログイン済みなら、リダイレクト)
  • 19. Controller <?php namespace AppHttpControllersAuth;
 
 // (snip)
 
 class AuthController extends Controller
 {
 use AuthenticatesAndRegistersUsers;
 
 public function __construct(Guard $auth, Registrar $registrar)
 {
 $this->auth = $auth;
 $this->registrar = $registrar;
 
 $this->middleware('guest', ['except' => 'getLogout']);
 }
 
 } トレイト
  • 20. Constructor Injection (c) 2015 Masashi Shinbara @shin1x1 • コンストラクタでタイプヒンティングで指定 • IoC コンテナから、インスタンスを注入 • インスタンスが無ければ、フレームワークが生成
  • 21. Constructor Injection public function __construct(Guard $auth, Registrar $registrar)
 {
 $this->auth = $auth;
 $this->registrar = $registrar;
 
 $this->middleware('guest', ['except' => 'getLogout']);
 } $auth = Guard クラスのインスタンス $registar = Registarクラスのインスタンス
  • 22. Middleware (c) 2015 Masashi Shinbara @shin1x1 • Decoratorパターン • 適用ミドルウェアをAppHttpKernelで定義 • ミドルウェアは、次のミドルウェアを呼ぶ • 一つの処理を行うミドルウェアを重ねていく
  • 23. Middleware public function handle($request, Closure $next)
 {
 if ($this->auth->check()) {
 return new RedirectResponse(url('/home'));
 }
 
 return $next($request);
 } ログイン済みなら、/homeへリダイレクト そうで無ければ、次のミドルウェアを呼ぶ
  • 24. Middleware Chain CheckForMaintenanceMode EncryptCookies AddQueuedCookiesToResponse StartSession ShareErrorsForSession RedirectIfAuthenticate Controller method
  • 25. ミドルウェアチェイン メンテナンスモード切り替え クッキーの複合、暗号 クッキーをレスポンスヘッダにセット セッション開始、後処理 エラー情報をビューにセット ログイン済みならリダイレクト Controller method
  • 26. Trait (c) 2015 Masashi Shinbara @shin1x1 • AuthControllerとPasswordController • コンストラクタのみで、実処理はトレイトに実装 • 独自コントローラにもトレイトを再利用できる
  • 27. Trait public function getRegister()
 {
 return view('auth.register');
 }
 
 public function postRegister(Request $request)
 {
 $validator = $this->registrar->validator($request->all());
 
 if ($validator->fails())
 {
 $this->throwValidationException(
 $request, $validator
 );
 }
 
 $this->auth->login($this->registrar->create($request->all()));
 
 return redirect($this->redirectPath());
 } method
  • 28. Trait public function getRegister()
 {
 return view('auth.register');
 }
 
 public function postRegister(Request $request)
 {
 $validator = $this->registrar->validator($request->all());
 
 if ($validator->fails())
 {
 $this->throwValidationException(
 $request, $validator
 );
 }
 
 $this->auth->login($this->registrar->create($request->all()));
 
 return redirect($this->redirectPath());
 } method injection
  • 29. Service (c) 2015 Masashi Shinbara @shin1x1
  • 30. Service (c) 2015 Masashi Shinbara @shin1x1 • コントローラから起動
 (コントローラ以外からの呼び出しも可) • ビジネスロジックを実装 • 永続化などは、Eloquent(モデル)に移譲 • GuardクラスとRegistrarクラス
  • 31. Service - Registrar class Registrar implements RegistrarContract
 {
 public function validator(array $data)
 {
 return Validator::make($data, [
 'name' => 'required|max:255',
 'email' => 'required|email|max:255|unique:users',
 'password' => 'required|confirmed|min:6',
 ]);
 }
 
 public function create(array $data)
 {
 return User::create([
 'name' => $data['name'],
 'email' => $data['email'],
 'password' => bcrypt($data['password']),
 ]);
 }
 } validator builder
  • 32. Service - Registrar class Registrar implements RegistrarContract
 {
 public function validator(array $data)
 {
 return Validator::make($data, [
 'name' => 'required|max:255',
 'email' => 'required|email|max:255|unique:users',
 'password' => 'required|confirmed|min:6',
 ]);
 }
 
 public function create(array $data)
 {
 return User::create([
 'name' => $data['name'],
 'email' => $data['email'],
 'password' => bcrypt($data['password']),
 ]);
 }
 } business logic
  • 33. Controller(with Trait) public function postRegister(Request $request)
 {
 $validator = $this->registrar->validator($request->all());
 
 if ($validator->fails())
 {
 $this->throwValidationException(
 $request, $validator
 );
 }
 
 $this->auth->login($this->registrar->create($request->all()));
 
 return redirect($this->redirectPath());
 } call service call servicecall service
  • 34. Model(Eloquent) (c) 2015 Masashi Shinbara @shin1x1
  • 35. Model(Eloquent) (c) 2015 Masashi Shinbara @shin1x1 • Contracts(インターフェース)を実装 • プロパティ定義のみ • 実処理は、トレイトに実装
  • 36. Model(Eloquent) class User extends Model implements AuthenticatableContract, CanResetPasswordContract
 {
 use Authenticatable, CanResetPassword;
 protected $table = 'users';
 protected $fillable = ['name', 'email', 'password'];
 protected $hidden = ['password', 'remember_token'];
 } Contract(interface) Trait
  • 37. まとめ
  • 38. まとめ (c) 2015 Masashi Shinbara @shin1x1 • 認証実装は、良いサンプル実装 • 役割を分け、シンプルな実装を • こうしないといけないわけじゃない • Laravelの実装で、アーキテクチャを学ぶ
  • 39. @shin1x1 (c) 2015 Masashi Shinbara @shin1x1