このページの2つのバージョン間の差分を表示します。
両方とも前のリビジョン 前のリビジョン 次のリビジョン | 前のリビジョン 次のリビジョン 両方とも次のリビジョン | ||
apricot:ext:session-auth [2020/05/24 09:45] y2sunlight [ミドルウェア] |
apricot:ext:session-auth [2020/05/25 11:32] y2sunlight [layout.blade.php] |
||
---|---|---|---|
行 1: | 行 1: | ||
- | > 編集中 | ||
- | |||
- | ----- | ||
- | |||
====== Apricot セッション認証 ====== | ====== Apricot セッション認証 ====== | ||
--- // | --- // | ||
行 24: | 行 20: | ||
- | ミドルウェアを使ってユーザのセッション認証を実装します。本章ではApricotのユーザ認証機能を使用しているので、まだお読みでない方は先に[[Apricot: | + | ミドルウェアを使ってユーザのセッション認証を実装します。本章ではApricotのユーザ認証機能を使用しているので、まだお読みでない方は先に[[Apricot: |
- | セッション認証ではログイン画面を作成してユーザ認証を行います。この認証方法ではログアウト機能が有効で、RememberMeトークンによる自動ログイン機能も実装します。比較的多くのユーザでサイトを運用する場合はこの認証方法をお薦めします。 | + | セッション認証ではログイン画面を作成してユーザ認証を行います。この認証方法ではログアウト機能が有効で、Remember-Meトークンによる自動ログイン機能も実装します。比較的多くのユーザでサイトを運用する場合はこの認証方法をお薦めします。 |
本機能は次の2つの部分に分かれます。 | 本機能は次の2つの部分に分かれます。 | ||
行 37: | 行 33: | ||
===== ミドルウェア ===== | ===== ミドルウェア ===== | ||
- | ==== SessionAuth | + | ==== SessionAuth |
以下に、セッション認証のミドルウェアを示します。 | 以下に、セッション認証のミドルウェアを示します。 | ||
行 49: | 行 45: | ||
use Core\Foundation\Invoker; | use Core\Foundation\Invoker; | ||
use Core\Foundation\Middleware\Middleware; | use Core\Foundation\Middleware\Middleware; | ||
- | use Core\Foundation\Security\UserAuth; | + | use App\Foundation\Security\AuthUser; |
/** | /** | ||
行 78: | 行 74: | ||
// Verify whether user is authenticated | // Verify whether user is authenticated | ||
- | if (UserAuth::verify()) | + | if (AuthUser::verify()) |
{ | { | ||
return $next-> | return $next-> | ||
行 89: | 行 85: | ||
</ | </ | ||
- | <WRAP left important 60%> | + | * [[apricot:ext: |
- | TODO: 説明文 | + | |
- | </WRAP> | + | * $this< |
+ | * AuthUser:: | ||
+ | * まだユーザ認証されていない場合は、ヘルパー関数 redirect() を呼び出してログイン画面にリダイレクトします。 | ||
+ | |||
+ | AuthUser の使用方法については、[[apricot: | ||
\\ | \\ | ||
行 98: | 行 98: | ||
セッション認証のミドルウェアをアプリケーションに設置します。 | セッション認証のミドルウェアをアプリケーションに設置します。 | ||
- | |||
- | > TODO: authの設定についても書く | ||
- | > authの詳細については、[[apricot: | ||
{{fa> | {{fa> | ||
行 109: | 行 106: | ||
' | ' | ||
\App\Middleware\AccessLog:: | \App\Middleware\AccessLog:: | ||
+ | \App\Middleware\VerifyCsrfToken:: | ||
// \App\Middleware\Auth\BasicAuth:: | // \App\Middleware\Auth\BasicAuth:: | ||
\App\Middleware\Auth\SessionAuth:: | \App\Middleware\Auth\SessionAuth:: | ||
], | ], | ||
+ | ' | ||
+ | ... | ||
+ | ], | ||
+ | ' | ||
+ | ' | ||
+ | ' | ||
+ | ' | ||
+ | ' | ||
+ | ' | ||
+ | ], | ||
+ | ], | ||
+ | ' | ||
+ | ' | ||
+ | ], | ||
+ | ]; | ||
</ | </ | ||
行 117: | 行 130: | ||
* middleware にセッション認証のミドルウェア \App\Middleware\Auth\SessionAuth:: | * middleware にセッション認証のミドルウェア \App\Middleware\Auth\SessionAuth:: | ||
+ | * auth.expires_sec --- RememberMeトークンクッキーの保存期間(秒単位) | ||
+ | * menu --- 画面の左上にユーザメニューを表示するか否か(既定値: | ||
\\ | \\ | ||
+ | ===== 認証コントローラ ===== | ||
- | ===== ルーティング | + | ==== ルーティング ==== |
以下のように config/ | 以下のように config/ | ||
行 135: | 行 151: | ||
{ | { | ||
// Auth | // Auth | ||
- | $r->get ('/ | ||
- | $r-> | ||
- | $r->get ('/ | ||
$r->get ('/ | $r->get ('/ | ||
$r-> | $r-> | ||
行 154: | 行 167: | ||
\\ | \\ | ||
- | ===== 認証コントローラ ===== | + | ==== AuthController クラス ==== |
以下に認証コントローラを示します。 | 以下に認証コントローラを示します。 | ||
行 164: | 行 177: | ||
use Core\Input; | use Core\Input; | ||
- | use Core\Foundation\Security\UserAuth; | ||
use Core\Foundation\ErrorBag; | use Core\Foundation\ErrorBag; | ||
+ | use App\Foundation\Security\AuthUser; | ||
use App\Foundation\Controller; | use App\Foundation\Controller; | ||
use App\Foundation\ValidatorErrorBag; | use App\Foundation\ValidatorErrorBag; | ||
行 174: | 行 187: | ||
class AuthController extends Controller | class AuthController extends Controller | ||
{ | { | ||
- | public function __construct() | ||
- | { | ||
- | } | ||
- | |||
/** | /** | ||
* ログインフォーム表示 | * ログインフォーム表示 | ||
行 184: | 行 193: | ||
public function showForm() | public function showForm() | ||
{ | { | ||
- | if (UserAuth::check()) | + | if (AuthUser::check()) |
{ | { | ||
// 認証済ならトップ画面表示 | // 認証済ならトップ画面表示 | ||
行 190: | 行 199: | ||
} | } | ||
- | if (UserAuth:: | + | if (AuthUser:: |
{ | { | ||
// 自動認証できたらトップ画面表示 | // 自動認証できたらトップ画面表示 | ||
行 214: | 行 223: | ||
$inputs = Input:: | $inputs = Input:: | ||
- | if (!UserAuth:: | + | if (!AuthUser:: |
{ | { | ||
// ユーザが見つからない | // ユーザが見つからない | ||
行 222: | 行 231: | ||
// ログイン成功 | // ログイン成功 | ||
- | return redirect(UserAuth:: | + | return redirect(AuthUser:: |
} | } | ||
行 254: | 行 263: | ||
{ | { | ||
// セッションの破棄 | // セッションの破棄 | ||
- | | + | |
// ログイン画面表示 | // ログイン画面表示 | ||
行 262: | 行 271: | ||
</ | </ | ||
- | <WRAP left important 60%> | + | * **showForm()** : ログイン画面表示 |
- | TODO: 説明文 | + | * AuthUser::check() で認証チェックします。 |
- | </WRAP> | + | * 認証済の場合: |
+ | * ヘルパー関数redirect()でトップ画面にリダイレクトします。\\ \\ | ||
+ | * 未認証の場合: | ||
+ | * AuthUser:: | ||
+ | * 成功の場合: | ||
+ | * トップ画面にリダイレクトします。 | ||
+ | * 失敗の場合: | ||
+ | * ログイン画面( login )にリダイレクトします。 | ||
+ | |||
+ | * **login()** : ログイン(認証) | ||
+ | * バリデーション( validate() )をしてエラーならエラー画面を返します。 | ||
+ | * バリデーション全体については[[apricot: | ||
+ | * Input:: | ||
+ | * AuthUser:: | ||
+ | * 成功した場合: | ||
+ | * AuthUser:: | ||
+ | * 失敗した場合: | ||
+ | * withInputs()で入力変数をフラッシュ変数に保存します。 | ||
+ | * withErrors()でバリデーションのエラーバッグをフラッシュ変数に保存します。 | ||
+ | * redirect()でログイン画面にリダイレクトするResponseオブジェクトをします。 | ||
+ | |||
+ | * **login()** : ログアウト | ||
+ | * AuthUser:: | ||
+ | * ログイン画面にリダイレクトします。 | ||
+ | |||
+ | AuthUser の使用方法については、[[apricot: | ||
+ | |||
+ | > 認証コントローラのバリデーションは(コードが少量なので)[[apricot: | ||
\\ | \\ | ||
- | ===== ログイン画面 | + | ==== ログイン画面 ==== |
以下に、ログイン画面で使用するHTMLテンプレートを示します。 | 以下に、ログイン画面で使用するHTMLテンプレートを示します。 | ||
行 371: | 行 408: | ||
</ | </ | ||
- | <WRAP left important 60%> | + | \\ |
- | TODO: 説明文 | + | |
- | </ | + | |
- | <WRAP left important 60%> | + | ==== 翻訳テキスト ==== |
- | TODO: ソースに@csr追加 | + | |
- | </WRAP> | + | ユーザ認証用の翻訳ファイル( auth.php )にログイン画面用の翻訳テキストを追加します。 |
+ | |||
+ | {{fa> | ||
+ | <code php auth.php> | ||
+ | <?php | ||
+ | return [ | ||
+ | ' | ||
+ | ... | ||
+ | ], | ||
+ | ' | ||
+ | ' | ||
+ | ' | ||
+ | ' | ||
+ | ' | ||
+ | ' | ||
+ | ' | ||
+ | ' | ||
+ | ], | ||
+ | ], | ||
+ | ]; | ||
+ | </code> | ||
\\ | \\ | ||
- | ===== layout.blade.phpの修正 ===== | + | ===== その他の画面修正 ===== |
- | [[apricot: | + | ==== layout.blade.php |
+ | [[apricot: | ||
{{fa> | {{fa> | ||
行 390: | 行 446: | ||
... | ... | ||
{{-- | {{-- | ||
- | @if(app_has(' | + | @if(app('auth.menu',false)) |
<ul class=" | <ul class=" | ||
<a id=" | <a id=" | ||
行 417: | 行 473: | ||
\\ | \\ | ||
- | ===== 翻訳テキスト ===== | + | ==== ホームコントローラー ==== |
- | + | ||
- | ユーザ認証用の翻訳ファイル( auth.php )にログイン画面用の翻訳テキストを追加します。 | + | |
- | + | ||
- | {{fa> | + | |
- | <code php auth.php> | + | |
- | <?php | + | |
- | return [ | + | |
- | ' | + | |
- | ... | + | |
- | ], | + | |
- | ' | + | |
- | ' | + | |
- | ' | + | |
- | ' | + | |
- | ' | + | |
- | ' | + | |
- | ' | + | |
- | ' | + | |
- | ], | + | |
- | ], | + | |
- | ]; | + | |
- | </ | + | |
- | + | ||
- | \\ | + | |
- | + | ||
- | ===== ホームコントローラーの変更 ===== | + | |
ホーム画面にログインユーザ名を表示するようにホームコントローラーを修正します。 | ホーム画面にログインユーザ名を表示するようにホームコントローラーを修正します。 | ||
行 476: | 行 506: | ||
===== テスト実行 ===== | ===== テスト実行 ===== | ||
+ | |||
セッション認証のテストをしてみましょう。初期状態(既定値)のユーザ名とパスワードは以下の通りです。初期のユーザ名とパスワードは [[apricot: | セッション認証のテストをしてみましょう。初期状態(既定値)のユーザ名とパスワードは以下の通りです。初期のユーザ名とパスワードは [[apricot: | ||
行 489: | 行 520: | ||
ログイン画面が表示されます。 | ログイン画面が表示されます。 | ||
- | [{{apricot: | + | [{{apricot: |
■ 正しいユーザ名とパスワードを入力して[ログイン]ボタンを押すと、ホーム画面が画面が表示されます。\\ | ■ 正しいユーザ名とパスワードを入力して[ログイン]ボタンを押すと、ホーム画面が画面が表示されます。\\ | ||
■ [ログイン状態を保存する]をチェックすると、ログイン状態でブラウザを閉じてもログイン状態が保持され、再度Apricotにアクセスすると自動ログイン機能が働きます。自動ログインの有効期間は[[# | ■ [ログイン状態を保存する]をチェックすると、ログイン状態でブラウザを閉じてもログイン状態が保持され、再度Apricotにアクセスすると自動ログイン機能が働きます。自動ログインの有効期間は[[# | ||
- | [{{apricot: | + | [{{apricot: |
■ 画像の下にユーザのアカウントが表示されています。\\ | ■ 画像の下にユーザのアカウントが表示されています。\\ | ||
■ ログアウトしたい場合は、画面右上のユーザ名をクリックして[ログアウト]を選択して下さい。 | ■ ログアウトしたい場合は、画面右上のユーザ名をクリックして[ログアウト]を選択して下さい。 |