0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

【Laravel8】アセットファイルの読み込みに認証を通す方法

Posted at

概要

Laravelではapp/storageへstoreAsメソッドなどでファイルを保存することができます。保存したファイルへのアクセスは、ファイルが保存されているディレクトリへのシンボリックリンクを貼り、パスを入力することで容易にできます。
例:app/storage/thumbnailにkuma.jpegを保存
スクリーンショット 2022-02-13 13.55.08.png

config/filesystems.php
    'links' => [
        public_path('storage') => storage_path('app/public'),
        public_path('thumbnail') => storage_path('app/thumbnail'), //追加
    ],
http://localhost:8000/thumbnail/kuma.jpeg

しかし会員制サイトの場合、外部のユーザーがURLを入力するだけでファイルへアクセスできることは望ましくありません。
今回は非認証ユーザーからのアクセスはログイン画面へリダイレクトし、認証済みユーザーのみがアクセスできるようにする方法を備忘録としてまとめます。

結論

route.php
Route::middleware('auth:user')->group(function () {
    // (略)
    Route::get('{file}/{any}', [AuthFileController::class, 'getFile'])
        ->where(['file' => 'pdf_file|thumbnail', 'any' => '.*'])
        ->name('auth.file');
    // (略)
});
AuthFileController.php
class AuthFileController extends Controller
{
    public function getAssetFile($file, $any)
    {
        // ファイルの存在を判定
        if(Storage::disk("local")->exists($file."/".$any)) {
            // storage/app下のファイルを返す
            return response()->file(Storage::path($file."/".$any));
        } else {
            // 404エラーの送信
            abort(404);
        }
    }
}

詳細

route.php

middlewareのgroupメソッド内に追加することで、ファイルへのアクセスパスに認証を通すことができます。

route.php
Route::middleware('auth:user')->group(function () {

whereメソッド

route.php
Route::get('{file}/{any}', [AuthFileController::class, 'getFile'])
            ->where(['file' => 'pdf_file|thumbnail', 'any' => '.*'])
            ->name('auth.file');

whereメソッドによって、{file}に入るルートパラメータの制約条件を追加することができます。この指定により、任意のファイルへのアクセスに認証を通す事ができます。今回の例ではstorage/thumbnailへのファイルと、storage/pdf_fileへのアクセスに認証を追加しています。
正規表現の制約

他のファイルへの認証を追加する場合、whereメソッドのルートパラメータへの追加と、シンボリックの追加のみで対応できます。

AuthFileController.php

こちらは今回の本筋とは少しずれますが、ルートパラメータからファイルの存在を確認し、なければ404エラーを返すようにしています。こちらは状況に応じてカスタマイズが必要な箇所だと思います。

まとめ

ファイルへのアクセス認証をまとめました。会員制サイトの制作に携わることがこれからも多そうなので、もし次同様のケースがあれば適用できればと思います。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?