質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

セッション

Sessionはクライアントがサーバに送ったすべてのリクエストのことを指します。

Q&A

解決済

1回答

2128閲覧

Laravel8でPHPネイティブセッションを使いたい

hotta

総合スコア1613

Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

セッション

Sessionはクライアントがサーバに送ったすべてのリクエストのことを指します。

0グッド

1クリップ

投稿2021/08/02 02:54

編集2021/08/02 03:00

既存のレガシーな PHP アプリに対して機能を追加しようとしていますが、技術的負債を返済していくにあたり、追加部分は Laravel8 で実装しようとしています。当方、Laravel 自体あまり詳しくなく、書籍や Web で情報収集している状態です。

設置ディレクトリや URL マッピング等はレガシー部分とは独立してデプロイするつもりですが、残念ながらセッション管理部分は既存の仕組みを使うしかなさそうです。

レガシーアプリでは、セッション管理部分は PHP のセッション(PHP Native Session - いわゆる $_SESSION) を使っているのですが、PHP Native Session は Laravel5 以降はサポートされなくなったようです。ついては、Laravel8 で PHP Native Session 機能を使うにあたり、手数が少なそうな手法をご教示いただきたく思います。

なお、ログイン画面やログアウト画面は既存のものを使い、パスワード忘れとかパスワード変更なども実装する予定はないので、単に「ログイン済みかどうか($_SESSION に特定のキーがあるかどうか)、またログイン済みの場合、そのユーザIDはなにか(そのキーの値)」だけがわかればいいと思っています。既存のユーザテーブルを Model 化する部分はすでにできています。

使うべき機能は必要最小限、middleware とか Guard あたりかなと想像していますが、その他にも UserProvider とか Authenticatable とか、調べるたびに増えていく状態です、、、

参考になりそうなところ:

シンプルですが、Laravel5 用なので変更が大きそう?

既存のコードが示されていないので、これでやれそうかという判断がつきません。

Laravel5 ベース、必要なコンポーネントが多すぎ‥。すべて必要?

ここを参考にしながら実装していますが、やりたいことは微妙に違う感じ、、、

以上、よろしくお願いします。参考までに、既存のロジックを示します。

php

1<?php 2class MyAuthLib 3{ 4 var $login_url = LOGIN_URL; 5 var $logout_url = LOGOUT_URL; 6 var $start_url = START_URL; 7 var $session_account = "account"; 8 9 function login_session() 10 { 11 @session_start(); 12 if ( isset($_SESSION[$this->session_account]) != false ) 13 { 14 header("Location: {$this->start_url}"); 15 exit; 16 } 17 } 18 19 function login_success($name) 20 { 21 session_regenerate_id(true); 22 $_SESSION[$this->session_account] = $name; 23 header("Location: {$this->start_url}"); 24 } 25 26 function check_session() 27 { 28 if ( defined("COOKIE_LIFETIME") != FALSE ) 29 session_set_cookie_params(COOKIE_LIFETIME); 30 @session_start(); 31 if ( isset($_SESSION[$this->session_account]) == false ) 32 { 33 header("Location: {$this->login_url}"); 34 exit; 35 } 36 } 37 38 function logout_session($token) 39 { 40 if ( $this->check_token($token) == FALSE ) 41 return FALSE; // error 42 if( isset($_SESSION) != FALSE ) 43 { 44 setcookie(session_name(), '', 1); 45 session_destroy(); 46 } 47 return TRUE; 48 } 49 50 function generate_token() 51 { 52 return hash("sha256", session_id() ); 53 } 54 55 function check_token($token) 56 { 57 return strcasecmp($token, $this->generate_token()) == 0; 58 } 59} 60

既存のテーブルを Model 化したもの:

<?php namespace App\Models; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; use Illuminate\Foundation\Auth\User as Authenticatable; class LoginUser extends Authenticatable { /** * See: https://readouble.com/laravel/8.x/ja/eloquent.html * デフォルトから逸脱する場合に必要なプロパティ */ protected $table = 'loginUser'; // テーブル名は loginusers ではなく 'loginUser' protected $primaryKey = 'userID'; // 主キーは 'id' ではなく 'userID' public $incrementing = false; // 主キーが増分整数値ではない protected $keyType = 'string'; // 主キーが整数ではなく文字列 const CREATED_AT = 'createdAt'; // 作成日時のフィールド名 const UPDATED_AT = 'updateAt'; // 更新日時のフィールド名 // 以下、Authenticatable 関連 /** * The attributes that are mass assignable. * * @var array */ protected $fillable = [ 'account' ]; public function getAuthIdentifierName() { return 'account'; }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

結局、銀の弾丸はないようでした。
いろいろと試してみた結果、認証だけであれば、今の所ミドルウェアの追加だけでうまくいっているように見えます。
Laravel では $_SESSION が有効化されていませんが、start_session() すると PHP のネイティブセッションが見えるようになります。
せっかく LoginUser クラスを作ったので、今後は ログインしているユーザを取得する部分も作っていけたらと思っています。

  • routes/web.php

php

1Route::get('/trap', [TrapSettingsController::class, 'index']) 2 ->middleware('custom'); // 追加
  • app/Http/Middleware/CustomAuthenticated.php

php

1namespace App\Http\Middleware; 2 3use Closure; 4use Illuminate\Http\Request; 5 6class CustomAuthenticated 7{ 8 public function handle(Request $request, Closure $next) 9 { 10 session_start(); 11 if (! isset($_SESSION['account'])) 12 { 13 return redirect()->away('/legacy/login.php'); 14 } 15 return $next($request); 16 } 17}
  • app/Http/Kernel.php

php

1 protected $routeMiddleware = [ 2 ... 3 'verified' => \Illuminate\Auth\Middleware\EnsureEmailIsVerified::class, 4 'custom' => \App\Http\Middleware\CustomAuthenticated::class, // 追加 5 ]; 6}

投稿2021/08/04 07:55

hotta

総合スコア1613

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kai0310

2021/08/04 08:12

そもそも Laravel を使ってコードを書いているのであれば、 $_SESSION は使わないかと思われます。
hotta

2021/08/05 20:35

問題をよく読んでください。Laravelでの書き起こしならLaravelのセッションが使えますが、レガシーなアプリと共存するため、レガシー側のセッション管理をLaravelから使うにはどうしたらいいのかという質問です。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問