Ground Sunlight

Windowsで作る - PHPプログラミングの開発環境

ユーザ用ツール

サイト用ツール


apricot:ext:session-auth

差分

このページの2つのバージョン間の差分を表示します。

この比較画面にリンクする

両方とも前のリビジョン 前のリビジョン
次のリビジョン
前のリビジョン
apricot:ext:session-auth [2020/05/25 10:24]
y2sunlight
apricot:ext:session-auth [2020/05/25 21:03] (現在)
y2sunlight [AuthController クラス]
行 20: 行 20:
  
  
-ミドルウェアを使ってユーザのセッション認証を実装します。本章ではApricotのユーザ認証機能を使用しているので、まだお読みでない方は先に[[Apricot:ext:user-auth|そちら]]をご一読下さい。を使用しています+ミドルウェアを使ってユーザのセッション認証を実装します。本章ではApricotのユーザ認証機能を使用しているので、まだお読みでない方は先に[[Apricot:ext:user-auth|そちら]]をご一読下さい。
  
-セッション認証ではログイン画面を作成してユーザ認証を行います。この認証方法ではログアウト機能が有効で、RememberMeトークンによる自動ログイン機能も実装します。比較的多くのユーザでサイトを運用する場合はこの認証方法をお薦めします。+セッション認証ではログイン画面を作成してユーザ認証を行います。この認証方法ではログアウト機能が有効で、Remember-Meトークンによる自動ログイン機能も実装します。比較的多くのユーザでサイトを運用する場合はこの認証方法をお薦めします。
  
 本機能は次の2つの部分に分かれます。 本機能は次の2つの部分に分かれます。
行 45: 行 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;
  
 /** /**
行 74: 行 74:
  
         // Verify whether user is authenticated         // Verify whether user is authenticated
-        if (UserAuth::verify())+        if (AuthUser::verify())
         {         {
             return $next->invoke();             return $next->invoke();
行 85: 行 85:
 </code> </code>
  
-<WRAP left important 60%> +  * [[apricot:ext:middleware#Middleware インターフェース|Middleware インターフェース]]の process() メソッドを実装します。 
-TODO説明文 + 
-</WRAP>+  * $this<nowiki>->exclude</nowiki配列に含まれているコントローラは認証から除外します。(公開のWebAPIなど) 
 +  * AuthUser::verify() で既に認証されているかを調べ、認証されていれば次の処理に制御を渡します。 
 +  * まだユーザ認証されていない場合は、ヘルパー関数 redirect() を呼び出してログイン画面にリダイレクトします。 
 + 
 +AuthUser の使用方法については、[[apricot:ext:user-auth#authuserクラス|こちら]]をご覧ください。
  
 \\ \\
行 147: 行 151:
     {     {
         // Auth         // Auth
-        $r->get ('/login', 'AuthController@showForm'); 
-        $r->post('/login', 'AuthController@login'); 
-        $r->get ('/logout', 'AuthController@logout'); 
         $r->get ('/login', 'AuthController@showForm');         $r->get ('/login', 'AuthController@showForm');
         $r->post('/login', 'AuthController@login');         $r->post('/login', 'AuthController@login');
行 176: 行 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;
行 186: 行 187:
 class AuthController extends Controller class AuthController extends Controller
 { {
-    public function __construct() 
-    { 
-    } 
- 
     /**     /**
      * ログインフォーム表示      * ログインフォーム表示
行 196: 行 193:
     public function showForm()     public function showForm()
     {     {
-        if (UserAuth::check())+        if (AuthUser::check())
         {         {
             // 認証済ならトップ画面表示             // 認証済ならトップ画面表示
行 202: 行 199:
         }         }
  
-        if (UserAuth::remember())+        if (AuthUser::remember())
         {         {
             // 自動認証できたらトップ画面表示             // 自動認証できたらトップ画面表示
行 226: 行 223:
         $inputs = Input::all();         $inputs = Input::all();
  
-        if (!UserAuth::authenticate($inputs['account'], $inputs['password'], !empty($inputs['remember'])))+        if (!AuthUser::authenticate($inputs['account'], $inputs['password'], !empty($inputs['remember'])))
         {         {
             // ユーザが見つからない             // ユーザが見つからない
行 234: 行 231:
  
         // ログイン成功         // ログイン成功
-        return redirect(UserAuth::getPathAfterLogin());+        return redirect(AuthUser::getPathAfterLogin());
     }     }
  
行 266: 行 263:
     {     {
         // セッションの破棄         // セッションの破棄
-        UserAuth::forget();+        AuthUser::forget();
  
         // ログイン画面表示         // ログイン画面表示
行 274: 行 271:
 </code> </code>
  
-<WRAP left important 60%> +  * **showForm()** : ログイン画面表示 
-TODO説明文 +    * AuthUser::check() で認証チェックします。 
-</WRAP>+      * 認証済の場合: 
 +        * ヘルパー関数redirect()でトップ画面にリダイレクトします。\\ \\  
 +      * 未認証の場合: 
 +        * AuthUser::remember()で自動ログインを試みます。 
 +          * 成功の場合: 
 +            * トップ画面にリダイレクトします。 
 +          * 失敗の場合: 
 +            * ログイン画面( login )にリダイレクトします。 
 + 
 +  * **login()** : ログイン(認証) 
 +    * バリデーション( validate() )を実行します。 
 +    * バリデーション全体については[[apricot:app:validation|こちら]]を、検証ルールについては[[apricot:app:validation#検証ルール|こちらを]]を参照して下さい。 
 +    * バリデーションでエラーの場合: 
 +      * withInputs()で入力変数をフラッシュ変数に保存します。 
 +      * withErrors()でバリデーションのエラーバッグをフラッシュ変数に保存します。 
 +      * redirect()でログイン画面にリダイレクトするResponseオブジェクトをします。\\ \\  
 +    * Input::all()でフォームデータを取得します。 
 +    * AuthUser::authenticate() でユーザ認証を行います。 
 +      * 成功した場合: 
 +        * AuthUser::getPathAfterLogin()でログイン後の画面を取得し、そこにリダイレクトします。 
 +      * 失敗した場合: 
 +        * withInputs()で入力変数をフラッシュ変数に保存します。 
 +        * withErrors()でバリデーションのエラーバッグをフラッシュ変数に保存します。 
 +        * redirect()でログイン画面にリダイレクトするResponseオブジェクトをします。 
 + 
 +  * **login()** : ログアウト 
 +    *  AuthUser::forget() で認証セッションを破棄します。 
 +    * ログイン画面にリダイレクトします。 
 + 
 +AuthUser の使用方法については、[[apricot:ext:user-auth#authuserクラス|こちら]]をご覧ください。 
 + 
 +認証コントローラのバリデーションは(コードが少量なので)[[apricot:app:validation#インターセプター|インターセプタークラス]]を作らずに自分のクラス内のメソッド( validate() で行っています。後述の「Apricot 拡張: [[apricot:ext:interceptor|インターセプター]]」では、validate()をクロージャにしてアクションと分離した形で再実装します。 
  
 \\ \\
行 382: 行 411:
 </html> </html>
 </code> </code>
- 
-<WRAP left important 60%> 
-TODO: 説明文 
-</WRAP> 
- 
-<WRAP left important 60%> 
-TODO: ソースに@csr追加 
-</WRAP> 
  
 \\ \\
行 429: 行 450:
 ... ...
             {{--             {{--
-            @if(app_has('auth'))+            @if(app('auth.menu',false))
             <ul class="navbar-nav ml-auto">             <ul class="navbar-nav ml-auto">
                 <a id="navbarDropdown" class="nav-link dropdown-toggle" href="#" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false" v-pre>                 <a id="navbarDropdown" class="nav-link dropdown-toggle" href="#" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false" v-pre>
-                    {{user()->account}} <span class="caret"></span>+                    {{AuthUser::getUser()->account}} <span class="caret"></span>
                 </a>                 </a>
                 <div class="dropdown-menu dropdown-menu-right" aria-labelledby="navbarDropdown">                 <div class="dropdown-menu dropdown-menu-right" aria-labelledby="navbarDropdown">
行 466: 行 487:
  
 use App\Foundation\Controller; use App\Foundation\Controller;
 +use App\Foundation\Security\AuthUser;
  
 /** /**
行 478: 行 500:
     public function index()     public function index()
     {     {
-        $message = __('messages.home.msg_hello', [':account'=>user()->account]);+        $message = __('messages.home.msg_hello', [':account'=>AuthUser::getUser()->account]);
         return render('home',['message'=>$message]);         return render('home',['message'=>$message]);
     }     }
行 484: 行 506:
 </code> </code>
  
-  * '' [':account'=>env('APP_NAME')] '' の部分を '' user()->account '' に変更します。+  * ''AuthUser'' の ''use'' を追加します。 
 +  * '' [':account'<nowiki>=></nowiki>env('APP_NAME')] '' の部分を '' AuthUser::getUser()<nowiki>->account</nowiki> '' に変更します。
  
 \\ \\
行 505: 行 528:
 [{{apricot:ext:ext07.png?nolink}}] [{{apricot:ext:ext07.png?nolink}}]
 ■ 正しいユーザ名とパスワードを入力して[ログイン]ボタンを押すと、ホーム画面が画面が表示されます。\\  ■ 正しいユーザ名とパスワードを入力して[ログイン]ボタンを押すと、ホーム画面が画面が表示されます。\\ 
-■ [ログイン状態を保存する]をチェックすると、ログイン状態でブラウザを閉じてもログイン状態が保持され、再度Apricotにアクセスすると自動ログイン機能が働きます。自動ログインの有効期間は[[#ユーザ認証の設定|app.phpのauth.expires_sec]]で設定して下さい。+■ [ログイン状態を保存する]をチェックすると、ログイン状態でブラウザを閉じてもログイン状態が保持され、再度Apricotにアクセスすると自動ログイン機能が働きます。自動ログインの有効期間は[[#セッション認証の設定|app.phpのauth.expires_sec]]で設定して下さい。
  
 [{{apricot:ext:ext08.png?nolink}}] [{{apricot:ext:ext08.png?nolink}}]
apricot/ext/session-auth.1590369890.txt.gz · 最終更新: 2020/05/25 10:24 by y2sunlight