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

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

ただいまの
回答率

88.10%

Laravelで認証が無くてもアクセスできるページの追加方法を教えてください。

解決済

回答 4

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 464

score 35

Auth::routes(); //認証機能を使用する。


この記載がある場合、どこのページにアクセスしてもログインしてなかったら、ログイン画面が表示される仕様となっていると思います。

しかし、現在実装したいこととして、ある特定のページには、ログインなしでアクセスできるようにしたいです。

そういった実装方法はございますでしょうか。

ご回答よろしくお願いいたします。

<?php

use App\Laboratory;
use Illuminate\Http\Request;

Auth::routes(); //認証機能を使用する。

Route::get('register/verify/{token}', 'Auth\RegisterController@showForm');

Route::post('register/main_check', 'Auth\RegisterController@mainCheck')->name('register.main.check');
Route::post('register/main_register', 'Auth\RegisterController@mainRegister')->name('register.main.registered');

Route::get('/home', 'LabController@index')->name('home');

Route::get('/review/{token}', 'LinkController@qr_to_add');

Route::group(['middleware' => ['web']], function ()
{

Route::post('register/pre_check', 'Auth\RegisterController@pre_check')->name('register.pre_check');

Route::get('/', 'LabController@index');
Route::post('/', 'LabController@index');

Route::get('/search_result', 'LabController@search');

Route::get('/area/{pre_name}','LabController@area_search');

Route::get('/faculty_result/{faculty}', 'LabController@faculty_result');

Route::post('/laboratories', 'LabController@store');

Route::post('/add/2', 'LabController@ret_univ');

Route::post('/laboratory/{laboratory}', 'LabController@store_evaluation');

Route::post('/', 'LabController@mv_add');

Route::post('/labedit/{lab_evaluation_id}','LabController@mv_update');

Route::post('/mypage/update', 'LabController@update');

Route::delete('/mypage/delete/{lab_evaluation_id}', 'LabController@delete');

Route::PUT('update',[
  'uses' => 'UserController@update',
  'as' => 'update'
]);


Route::get('/add', 'LinkController@to_add');

Route::POST('/add_evaluation', 'LabController@add_evaluation');

Route::GET('/add_evaluation',  function()
{
    return view('add_evaluation');
});

Route::get('/add_evaluation/{lab_details_univ}/{lab_details_lab}', 'LinkController@to_add_evaluation');

Route::get('/univ/{univ_name}','LinkController@to_univ');

Route::get('/lab/{lab_details_univ}/{lab_details_lab}','LinkController@to_lab_details');

Route::get('/lab-evaluation/{lab_evaluation_details}','LinkController@to_lab_evaluation_details');

Route::get('/mypage','LinkController@to_mypage');


Route::get('/confirm_user',[
  'uses' => 'UserController@confirm_user',
  'as' => 'confirm'
]);

Route::get('/edit_user','UserController@edit_user');


Route::get('/scraping','ScrapingController@scraping');

});

調べたところ、こちらのサイトで

<?php

namespace App\Http\Middleware;

use Illuminate\Auth\Middleware\Authenticate as Middleware;

class Authenticate extends Middleware
{
    /**
     * Get the path the user should be redirected to when they are not authenticated.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return string|null
     */
    protected function redirectTo($request)
    {
        if (! $request->expectsJson()) {
            return route('login');
        }
    }
}

ここで、認証のないアカウントのリダイレクト処理が行われていると書いていました。

Auth::route()からいろいろ経由してここに飛んでくるみたいなのですが、ここでの引数($request)とは一体なにを指すのでしょうか?

もし、Authenticate.phpで

    protected function redirectTo($request)
    {
        if(ある特定のパスにアクセスがあったとき){
            ある特定のページにリダイレクトする。
        }
        //それ以外は
        elseif (! $request->expectsJson()) {
            return route('login');
        }
    }

このような形で、ある特定ページにのみ認証なしでアクセスすることは可能でしょうか。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 4

checkベストアンサー

+2

Auth::routes(); があっても、 welcome ページや、ログインページは、認証してなくてもアクセスできるじゃない?
同じようにルート定義すれば済むことじゃありませんか?

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/09/01 14:43

    記憶の範囲では、カスタマイズしていなくて、どのページかは忘れましたが、Authで認証機能を追加するみたいなページの手順に沿って、行っただけなので、あまりAuthがどういう仕組みでどのパスをリダイレクトしているかよくわかってないんですよね・・・(今急遽勉強しています。)

    キャンセル

  • 2020/09/01 14:44

    Qiitaなんて参考にしちゃダメよ。
    間違っている記事山ほどあるから。

    キャンセル

  • 2020/09/01 14:47

    公式ドキュメントってどうしてもある程度理解できてる前提でファイルのある場所とか省略されてること多いので、Qiita参考にしまくってました。

    公式ドキュメントを徹底してみようと思います・・・

    キャンセル

+2

Googleでauth::routes() readouble.comを検索するとこれとかこれが見つかり、以下のような記述を見つける事が出来ます。

ルートの保護

ルートミドルウェアは特定のルートに対し、認証済みユーザーのみアクセスを許すために使われます。LaravelにはIlluminate\Auth\Middleware\Authenticateの中で定義されているauthミドルウェアが最初から用意されています。このミドルウェアは、HTTPカーネルで登録済みのため、必要なのはルート定義でこのミドルウェアを指定するだけです。

Route::get('profile', function() {
    // 認証済みのユーザーのみが入れる
})->middleware('auth');

まずは調べ、そして試し、試した結果うまくいかなかった事を質問するとより丁寧な回答がつく事でしょう。質問内容次第では具体的なコードを回答にもらえる事もあります。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/09/01 15:23

    > 「認証してないユーザーのみがアクセスできる設定」
    であれば質問文にそのように記載しましょう。認証しなくてもアクセス出来るページと書いてあれば、認証済みでも認証して無くてもアクセスできるページと読み取ります。
    そうなると参考にするべきマニュアルは他のページになりますが、それらは既にphper.kさんがコメントで書かれているのでそちらを確認してください。しかしphper.kさんに指摘されているように、コメントでのやり取りしている内容を見る限りはやはり特殊な設定をしているのでしょう。

    まずはLaravelのマニュアルの手順通りにAuthを設定し、正常にAuthが動く状態にするのが先決かと思います。

    キャンセル

  • 2020/09/01 18:11

    認証していないユーザーのみがアクセスできる設定と書きましたが、hentaimanさんの認識、そして質問文(特定のページには、ログインなしでアクセスできる)通り、認証の有無にかかわらずアクセスできる設定という認識で構いません。

    >>認証しなくてもアクセス出来るページと書いてあれば、認証済みでも認証して無くてもアクセスできるページと読み取ります。
    このように読み取ったのであれば、最初の回答は不適切では??


    低評価をつけさせてもらったのは、抜粋が「認証された場合のみアクセスできる設定」であったためです。ただ、私の質問文があやふやであったことも否めませんので、低評価を取り消させていただきました。失礼いたしました。

    キャンセル

  • 2020/09/01 19:30

    > 不適切では??
    なぜ?例にある書き方をしない場合が未認証でもアクセス出来るページと読み取れるのが普通では?

    キャンセル

0

この記載がある場合、どこのページにアクセスしてもログインしてなかったら、ログイン画面が表示される仕様となっていると思います。

いいえ、Auth::routes()は会員登録関係のルートを追加します
ファイル中のルーティングがログイン必須にするのはまた別の処理です。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/09/01 13:16

    なるほど。ご教示ありがとうございます。

    それで、ログインなしでアクセスできるページを追加するにはどうすればよいでしょうか。

    キャンセル

0

結論としては、ルート定義で呼び出したコントローラーの先頭で、

    public function __construct()
    {
      $this->middleware('auth');
    }


を記載していたことが原因でした。

コントローラーを複数用意し、ひとつは認証アリで、ひとつは認証なくてもOKのように実装することで、質問文通りの実装が可能となりました。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 88.10%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る