Laravel 5.4で実行されているアプリケーションの登録ルートを無効にしようとしています。
ルートファイルには、
Auth::routes();
登録ルートを無効にする方法はありますか?
code
:
Auth::routes();
このルートのコレクションのショートカット:
// Authentication Routes...
Route::get('login', 'Auth\LoginController@showLoginForm')->name('login');
Route::post('login', 'Auth\LoginController@login');
Route::post('logout', 'Auth\LoginController@logout')->name('logout');
// Registration Routes...
Route::get('register', 'Auth\RegisterController@showRegistrationForm')->name('register');
Route::post('register', 'Auth\RegisterController@register');
// Password Reset Routes...
Route::get('password/reset', 'Auth\ForgotPasswordController@showLinkRequestForm')->name('password.request');
Route::post('password/email', 'Auth\ForgotPasswordController@sendResetLinkEmail')->name('password.email');
Route::get('password/reset/{token}', 'Auth\ResetPasswordController@showResetForm')->name('password.reset');
Route::post('password/reset', 'Auth\ResetPasswordController@reset');
そのため、最初のルートをルートのリストに置き換えて、アプリケーションで不要なルートをコメントアウトできます。
laravel version => 5.7
の編集
新しいバージョンでは、Auth::routes()
関数呼び出しにパラメーターを追加して、登録ルートを無効にできます。
Auth::routes(['register' => false]);
メール確認ルートが追加されました:
Route::get('email/verify', 'Auth\VerificationController@show')->name('verification.notice');
Route::get('email/verify/{id}', 'Auth\VerificationController@verify')->name('verification.verify');
Route::get('email/resend', 'Auth\VerificationController@resend')->name('verification.resend');
ところで、Password Reset
およびEmail Verification
ルートを無効にすることもできます。
Auth::routes(['reset' => false, 'verify' => false]);
Laravel 5.7以降、新しい$options
パラメーターが Auth::routes()
メソッドに導入されました。ユーザー認証用のrequiredルートの生成を制御する配列を渡すことができます(有効なエントリは'register'
から選択できます) 、'reset'
、または'verify'
文字列リテラル)。
Auth::routes(['register' => false]);
これを試すことができます。
Route::match(['get', 'post'], 'register', function(){
return redirect('/');
});
Auth::routes()
のすぐ下にこれらのルートを追加して、デフォルトの登録ルートをオーバーライドします。 /register
ルートへのリクエストはすべてbaseUrlにリダイレクトされます。
これは一見簡単です! app/Http/Controllers/Auth/RegisterController.php
クラスの2つのメソッドをオーバーライドするだけです。以下を参照してください。フォームが表示されなくなり、最も重要なことは、登録のためのアプリケーションへの直接POST要求をブロックすることです。
/**
* Show the application registration form.
*
* @return \Illuminate\Http\Response
*/
public function showRegistrationForm()
{
return redirect('login');
}
/**
* Handle a registration request for the application.
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\Response
*/
public function register(Request $request)
{
abort(404);
}
Web.phpで、置換
Auth::routes();
と
Auth::routes(['register' => false]);
そのため、デフォルトの認証ルートリストから登録ルートを削除できます。 5.7で試したところ、うまくいきました。
上記のソリューションは機能しますが、'auth'
のmiddleware
をApp\Http\Controllers\Auth\RegisterController
に変更するのが最も簡単なソリューションの1つになると思います。これにより、すべての訪問者が登録ルートにアクセスしたい場合、ログインページにリダイレクトされます。このような:
namespace App\Http\Controllers\Auth;
class RegisterController extends Controller
{
public function __construct()
{
$this->middleware('auth');
}
Web.phpファイルで次のようにできると思います。
Route::redirect('register', 'login', 301);
私のLaravel 5.6プロジェクトでは、このメソッドは機能しませんでした:
Auth::routes(['register' => false]);
そのため、次の方法を使用する必要がありました。
Route::match(['get', 'post'], 'register', function () { return abort(403, 'Forbidden'); })->name('register');
ゲストの一部のページへのアクセスを制限し、ゲストのみを管理できるのは管理者だけだと思います。以下のようにkernel.phpファイルに独自のミドルウェアを追加することでそれを達成できます。
protected $routeMiddleware = [
'authenticated' => \App\Http\Middleware\AuthenticatedMiddleware::class
];
ミドルウェアを作成したら、それを使用して、ルートがあるweb.phpファイルに移動し、以下のように制限したいルートに追加する必要があります。
Route::get('register', 'Auth\RegisterController@showRegistrationForm')->name('register')->middleware('authenticated');
Route::post('register', 'Auth\RegisterController@register')->middleware('authenticated');
この方法では、登録はゲストに制限されますが、管理者は他の管理者を登録したい場合でも引き続きページにアクセスできます!
Auth::routes();
を以下の詳細リストに置き換えることを忘れないでください:
// Authentication Routes...
Route::get('login', 'Auth\LoginController@showLoginForm')->name('login');
Route::post('login', 'Auth\LoginController@login');
Route::post('logout', 'Auth\LoginController@logout')->name('logout');
// Registration Routes...
Route::get('register', 'Auth\RegisterController@showRegistrationForm')->name('register')->middleware('authenticated');
Route::post('register', 'Auth\RegisterController@register')->middleware('authenticated');
// Password Reset Routes...
Route::get('password/reset', 'Auth\ForgotPasswordController@showLinkRequestForm')->name('password.request');
Route::post('password/email', 'Auth\ForgotPasswordController@sendResetLinkEmail')->name('password.email');
Route::get('password/reset/{token}', 'Auth\ResetPasswordController@showResetForm')->name('password.reset');
Route::post('password/reset', 'Auth\ResetPasswordController@reset');
この2つのメソッドをapp\Http\Controllers\Auth\RegisterController.phpに追加します
public function showRegistrationForm(){
return redirect('login');
}
public function register(){
}
Authを上書きするだけですshowRegistrationForm() method(このコードをAuth/RegisterControllerに配置してください)
public function showRegistrationForm() { return redirect()->route('login'); }
登録ルートをログインルートにリダイレクトしています。ここでは、他のコードを追加または削除する必要はありません